Queryable.purs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. module LinkedIn.Queryable where
  2. import Prelude
  3. import Data.List.NonEmpty (NonEmptyList)
  4. import Data.List.NonEmpty as NEL
  5. import Data.Maybe (Maybe(..), fromJust)
  6. import Effect (Effect)
  7. import Partial.Unsafe (unsafePartial)
  8. import Web.DOM (Document, Node, ParentNode)
  9. import Web.DOM.Document as D
  10. import Web.DOM.Element as E
  11. import Web.DOM.Node as N
  12. import Web.DOM.NodeList as NL
  13. import Web.DOM.ParentNode (QuerySelector(..), querySelector, querySelectorAll)
  14. -- A light abstraction layer above the DOM query API
  15. class Queryable a where
  16. toParentNode :: a -> ParentNode
  17. toChildrenArray :: a -> Effect (Array Node)
  18. instance Queryable Node where
  19. toParentNode :: Node -> ParentNode
  20. toParentNode n =
  21. unsafePartial $ fromJust $ intoParentNode' n where
  22. intoParentNode' :: Node -> Maybe ParentNode
  23. intoParentNode' node = do
  24. he <- E.fromNode node
  25. pure $ E.toParentNode he
  26. toChildrenArray n = do
  27. children <- N.childNodes n
  28. NL.toArray children
  29. instance Queryable Document where
  30. toParentNode = D.toParentNode
  31. toChildrenArray d = toChildrenArray $ D.toNode d
  32. queryOneNode :: forall a. Queryable a => String -> a -> Effect (Maybe Node)
  33. queryOneNode selector n = do
  34. found <- querySelector (QuerySelector selector) $ toParentNode n
  35. pure case found of
  36. Nothing -> Nothing
  37. Just el -> Just $ E.toNode el
  38. queryAllNodes :: forall a. Queryable a => String -> a -> Effect (Maybe (NonEmptyList Node))
  39. queryAllNodes selector n = do
  40. found <- querySelectorAll (QuerySelector selector) $ toParentNode n
  41. liftA1 NEL.fromFoldable $ NL.toArray found
  42. getChildrenArray :: forall a. Queryable a => a -> Effect (Array Node)
  43. getChildrenArray = toChildrenArray