Queryable.purs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 Effect (Effect)
  9. import Partial.Unsafe (unsafePartial)
  10. import Web.DOM (Document, Node, ParentNode)
  11. import Web.DOM.Document as D
  12. import Web.DOM.Element as E
  13. import Web.DOM.Node as N
  14. import Web.DOM.NodeList as NL
  15. import Web.DOM.ParentNode (QuerySelector(..), querySelector, querySelectorAll)
  16. -- A light abstraction layer above the DOM query API
  17. class Queryable a where
  18. toNode :: a -> Node
  19. toParentNode :: a -> ParentNode
  20. instance Queryable Node where
  21. toParentNode :: Node -> ParentNode
  22. toParentNode n =
  23. unsafePartial $ fromJust $ intoParentNode' n where
  24. intoParentNode' :: Node -> Maybe ParentNode
  25. intoParentNode' node = do
  26. he <- E.fromNode node
  27. pure $ E.toParentNode he
  28. toNode = identity
  29. instance Queryable Document where
  30. toNode = D.toNode
  31. toParentNode = D.toParentNode
  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. queryAllNodes' :: forall a. Queryable a => String -> a -> Effect (List Node)
  43. queryAllNodes' selector n = do
  44. found <- querySelectorAll (QuerySelector selector) $ toParentNode n
  45. foundArr <- NL.toArray found
  46. pure $ L.fromFoldable foundArr
  47. getChildrenArray :: forall a. Queryable a => a -> Effect (Array Node)
  48. getChildrenArray n = do
  49. children <- N.childNodes $ toNode n
  50. NL.toArray children