Queryable.purs 1.6 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. toNode :: a -> Node
  17. toParentNode :: a -> ParentNode
  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. toNode = identity
  27. instance Queryable Document where
  28. toNode = D.toNode
  29. toParentNode = D.toParentNode
  30. queryOneNode :: forall a. Queryable a => String -> a -> Effect (Maybe Node)
  31. queryOneNode selector n = do
  32. found <- querySelector (QuerySelector selector) $ toParentNode n
  33. pure case found of
  34. Nothing -> Nothing
  35. Just el -> Just $ E.toNode el
  36. queryAllNodes :: forall a. Queryable a => String -> a -> Effect (Maybe (NonEmptyList Node))
  37. queryAllNodes selector n = do
  38. found <- querySelectorAll (QuerySelector selector) $ toParentNode n
  39. liftA1 NEL.fromFoldable $ NL.toArray found
  40. getChildrenArray :: forall a. Queryable a => a -> Effect (Array Node)
  41. getChildrenArray n = do
  42. children <- N.childNodes $ toNode n
  43. NL.toArray children