Преглед изворни кода

Replace redundant code with Queryable typeclass

jherve пре 1 година
родитељ
комит
314604e254
4 измењених фајлова са 47 додато и 49 уклоњено
  1. 1 13
      src/LinkedIn.purs
  2. 3 3
      src/LinkedIn/QueryRunner.purs
  3. 43 0
      src/LinkedIn/Queryable.purs
  4. 0 33
      src/LinkedIn/Utils.purs

+ 1 - 13
src/LinkedIn.purs

@@ -2,29 +2,16 @@ module LinkedIn where
 
 import Prelude
 
-import Data.List.NonEmpty as NEL
 import Data.List.Types (NonEmptyList)
 import Data.Maybe (Maybe(..))
 import Data.Traversable (traverse)
 import Effect (Effect)
 import LinkedIn.DetachedNode (DetachedNode, asTree', cutBranches, filterEmpty)
+import LinkedIn.Queryable (queryAllNodes)
 import Web.DOM (Document, Node)
-import Web.DOM.Document as D
 import Web.DOM.Node (nodeName)
-import Web.DOM.NodeList as NL
-import Web.DOM.ParentNode (QuerySelector(..), querySelectorAll)
 import Yoga.Tree (Tree)
 
-
-fromDocument ∷ Document → Node
-fromDocument doc = D.toNode doc
-
-queryAllNodes :: String -> Document -> Effect (Maybe (NonEmptyList Node))
-queryAllNodes selector doc = do
-  found <- querySelectorAll (QuerySelector selector) $ D.toParentNode doc
-  liftA1 NEL.fromFoldable $ NL.toArray found
-
 -- First pass of naming ; from here we know what we are looking for
 
 data LinkedInUIElementType = LinkedInUIArtDecoCard | LinkedInUIArtDecoTab | LinkedInUIJobsUnifiedTopCard

+ 3 - 3
src/LinkedIn/QueryRunner.purs

@@ -12,7 +12,7 @@ import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Traversable (traverse)
 import Effect (Effect)
-import LinkedIn.Utils as U
+import LinkedIn.Queryable (queryAllNodes, queryOneNode)
 import Web.DOM (Node)
 import Web.DOM.Node as N
 import Web.DOM.NodeList as NL
@@ -52,7 +52,7 @@ ignoreErrors = mapExceptT (map ignoreErrors')
 
 queryOne ∷ String → QueryRunner Node
 queryOne selector node = ExceptT $ do
-  maybeNode <- U.queryOneNode selector node
+  maybeNode <- queryOneNode selector node
   pure $ note (QNodeNotFoundError selector) maybeNode
 
 queryText ∷ Int -> QueryRunner Node
@@ -69,7 +69,7 @@ queryText idx n = ExceptT $ do
 
 queryAll ∷ String → QueryRunner (NonEmptyList Node)
 queryAll selector node = ExceptT $ do
-  maybeNodes <- U.queryAllNodes selector node
+  maybeNodes <- queryAllNodes selector node
   pure $ note (QNodeListNotFoundError selector) maybeNodes
 
 subQueryMany ∷ ∀ a. QueryRunner a → String → QueryRunner (NonEmptyList a)

+ 43 - 0
src/LinkedIn/Queryable.purs

@@ -0,0 +1,43 @@
+module LinkedIn.Queryable where
+
+import Prelude
+
+import Data.List.NonEmpty (NonEmptyList)
+import Data.List.NonEmpty as NEL
+import Data.Maybe (Maybe(..), fromJust)
+import Effect (Effect)
+import Partial.Unsafe (unsafePartial)
+import Web.DOM (Document, Node, ParentNode)
+import Web.DOM.Document as D
+import Web.DOM.Element as E
+import Web.DOM.NodeList as NL
+import Web.DOM.ParentNode (QuerySelector(..), querySelector, querySelectorAll)
+
+-- A light abstraction layer above the DOM query API
+
+class Queryable a where
+  toParentNode :: a -> ParentNode
+
+instance Queryable Node where
+  toParentNode :: Node -> ParentNode
+  toParentNode n =
+    unsafePartial $ fromJust $ intoParentNode' n where
+        intoParentNode' :: Node -> Maybe ParentNode
+        intoParentNode' node = do
+          he <- E.fromNode node
+          pure $ E.toParentNode he
+
+instance Queryable Document where
+  toParentNode = D.toParentNode
+
+queryOneNode :: forall a. Queryable a => String -> a -> Effect (Maybe Node)
+queryOneNode selector n = do
+  found <- querySelector (QuerySelector selector) $ toParentNode n
+  pure case found of
+    Nothing -> Nothing
+    Just el -> Just $ E.toNode el
+
+queryAllNodes :: forall a. Queryable a => String -> a -> Effect (Maybe (NonEmptyList Node))
+queryAllNodes selector n = do
+  found <- querySelectorAll (QuerySelector selector) $ toParentNode n
+  liftA1 NEL.fromFoldable $ NL.toArray found

+ 0 - 33
src/LinkedIn/Utils.purs

@@ -1,33 +0,0 @@
-module LinkedIn.Utils (queryOneNode, queryAllNodes) where
-
-import Prelude
-
-import Data.List.NonEmpty (NonEmptyList)
-import Data.List.NonEmpty as NEL
-import Data.Maybe (Maybe(..), fromJust)
-import Effect (Effect)
-import Partial.Unsafe (unsafePartial)
-import Web.DOM (Node, ParentNode)
-import Web.DOM.Element as E
-import Web.DOM.NodeList as NL
-import Web.DOM.ParentNode (QuerySelector(..), querySelector, querySelectorAll)
-
-toParentNode' :: Node -> ParentNode
-toParentNode' n =
-  unsafePartial $ fromJust $ intoParentNode' n where
-      intoParentNode' :: Node -> Maybe ParentNode
-      intoParentNode' node = do
-        he <- E.fromNode node
-        pure $ E.toParentNode he
-
-queryOneNode :: String -> Node -> Effect (Maybe Node)
-queryOneNode selector n = do
-  found <- querySelector (QuerySelector selector) $ toParentNode' n
-  pure case found of
-    Nothing -> Nothing
-    Just el -> Just $ E.toNode el
-
-queryAllNodes :: String -> Node -> Effect (Maybe (NonEmptyList Node))
-queryAllNodes selector n = do
-  found <- querySelectorAll (QuerySelector selector) $ toParentNode' n
-  liftA1 NEL.fromFoldable $ NL.toArray found