Просмотр исходного кода

Replace redundant code with Queryable typeclass

jherve 1 год назад
Родитель
Сommit
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 Prelude
 
 
-import Data.List.NonEmpty as NEL
 import Data.List.Types (NonEmptyList)
 import Data.List.Types (NonEmptyList)
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Traversable (traverse)
 import Data.Traversable (traverse)
 import Effect (Effect)
 import Effect (Effect)
 import LinkedIn.DetachedNode (DetachedNode, asTree', cutBranches, filterEmpty)
 import LinkedIn.DetachedNode (DetachedNode, asTree', cutBranches, filterEmpty)
+import LinkedIn.Queryable (queryAllNodes)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
-import Web.DOM.Document as D
 import Web.DOM.Node (nodeName)
 import Web.DOM.Node (nodeName)
-import Web.DOM.NodeList as NL
-import Web.DOM.ParentNode (QuerySelector(..), querySelectorAll)
 import Yoga.Tree (Tree)
 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
 -- First pass of naming ; from here we know what we are looking for
 
 
 data LinkedInUIElementType = LinkedInUIArtDecoCard | LinkedInUIArtDecoTab | LinkedInUIJobsUnifiedTopCard
 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.Show.Generic (genericShow)
 import Data.Traversable (traverse)
 import Data.Traversable (traverse)
 import Effect (Effect)
 import Effect (Effect)
-import LinkedIn.Utils as U
+import LinkedIn.Queryable (queryAllNodes, queryOneNode)
 import Web.DOM (Node)
 import Web.DOM (Node)
 import Web.DOM.Node as N
 import Web.DOM.Node as N
 import Web.DOM.NodeList as NL
 import Web.DOM.NodeList as NL
@@ -52,7 +52,7 @@ ignoreErrors = mapExceptT (map ignoreErrors')
 
 
 queryOne ∷ String → QueryRunner Node
 queryOne ∷ String → QueryRunner Node
 queryOne selector node = ExceptT $ do
 queryOne selector node = ExceptT $ do
-  maybeNode <- U.queryOneNode selector node
+  maybeNode <- queryOneNode selector node
   pure $ note (QNodeNotFoundError selector) maybeNode
   pure $ note (QNodeNotFoundError selector) maybeNode
 
 
 queryText ∷ Int -> QueryRunner Node
 queryText ∷ Int -> QueryRunner Node
@@ -69,7 +69,7 @@ queryText idx n = ExceptT $ do
 
 
 queryAll ∷ String → QueryRunner (NonEmptyList Node)
 queryAll ∷ String → QueryRunner (NonEmptyList Node)
 queryAll selector node = ExceptT $ do
 queryAll selector node = ExceptT $ do
-  maybeNodes <- U.queryAllNodes selector node
+  maybeNodes <- queryAllNodes selector node
   pure $ note (QNodeListNotFoundError selector) maybeNodes
   pure $ note (QNodeListNotFoundError selector) maybeNodes
 
 
 subQueryMany ∷ ∀ a. QueryRunner a → String → QueryRunner (NonEmptyList a)
 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