Queryable.purs 1.9 KB

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