Ver código fonte

Refactor high-level code into a LinkedIn module

jherve 1 ano atrás
pai
commit
d083798e3f
2 arquivos alterados com 57 adições e 50 exclusões
  1. 6 50
      src/Content.purs
  2. 51 0
      src/LinkedIn.purs

+ 6 - 50
src/Content.purs

@@ -3,21 +3,14 @@ module ExampleWebExt.Content where
 import Prelude
 
 import Browser.DOM (getBrowserDom)
-import Data.Either (Either(..), hush)
-import Data.Maybe (Maybe(..))
-import Data.Traversable (class Traversable, traverse)
 import Effect (Effect)
 import Effect.Class.Console (logShow)
 import Effect.Console (log)
-import LinkedIn.DetachedNode (DetachedNode, toDetached)
+import LinkedIn (run, runToDetached)
 import LinkedIn.Page.JobOffer as PageJ
 import LinkedIn.Page.Projects as PageP
 import LinkedIn.Page.Skills as PageS
 import LinkedIn.Page.WorkExperiences as PageWE
-import LinkedIn.QueryRunner (QueryRunner', runQuery)
-import LinkedIn.UI.Elements.Parser (fromDetachedToUI)
-import LinkedIn.UI.Elements.Types (UIElement)
-import Web.DOM (Document, Node)
 
 main :: Effect Unit
 main = do
@@ -25,46 +18,9 @@ main = do
 
   dom <- getBrowserDom
 
-  runQueryAndExtract PageWE.query PageWE.extract dom >>= logShow
-  runQueryAndExtract PageP.query PageP.extract dom >>= logShow
-  runQueryAndExtract PageS.query PageS.extract dom >>= logShow
-  runQueryAndExtract PageJ.query PageJ.extract dom >>= logShow
+  run PageWE.query PageWE.extract dom >>= logShow
+  run PageP.query PageP.extract dom >>= logShow
+  run PageS.query PageS.extract dom >>= logShow
+  run PageJ.query PageJ.extract dom >>= logShow
 
-  runQueryAndDetach PageJ.query dom >>= logShow
-
-extractData ∷ ∀ t a. Traversable t ⇒ (t UIElement → Either String a) → t Node → Effect (Either String a)
-extractData parsePageUI n = do
-  d <- traverse toDetached n
-  pure $ case fromDetachedToUI d of
-      Left l -> Left l
-      Right ui -> parsePageUI ui
-
-runQueryAndExtract ∷
-  ∀ t a.
-  Traversable t
-  => Show a
-  ⇒ QueryRunner' Document (t Node)
-  → (t UIElement → Either String a)
-  → Document
-  → Effect (Maybe a)
-runQueryAndExtract query extract dom = do
-  n <- runQuery $ query dom
-  case n of
-    Left _ -> pure Nothing
-    Right q -> do
-      extracted <- (extractData extract) q
-      pure $ hush extracted
-
-runQueryAndDetach ∷
-  ∀ f1.
-  Traversable f1
-  ⇒ QueryRunner' Document (f1 Node)
-  → Document
-  → Effect (Maybe (f1 DetachedNode))
-runQueryAndDetach query dom = do
-  n <- runQuery $ query dom
-  case n of
-    Left _ -> pure Nothing
-    Right q -> do
-      d <- traverse toDetached q
-      pure $ Just d
+  runToDetached PageJ.query dom >>= logShow

+ 51 - 0
src/LinkedIn.purs

@@ -0,0 +1,51 @@
+module LinkedIn (run, runToDetached) where
+
+import Prelude
+
+import Data.Either (Either(..))
+import Data.Traversable (class Traversable, traverse)
+import Effect (Effect)
+import LinkedIn.DetachedNode (DetachedNode, toDetached)
+import LinkedIn.QueryRunner (QueryError, QueryRunner', runQuery)
+import LinkedIn.UI.Elements.Parser (fromDetachedToUI)
+import LinkedIn.UI.Elements.Types (UIElement)
+import Web.DOM (Document, Node)
+
+run :: forall t a.
+  Traversable t
+  ⇒ QueryRunner' Document (t Node)
+  -> (t UIElement → Either String a)
+  -> Document
+  -> Effect (Either String a)
+run query parse dom = do
+  detached <- runToDetached query dom
+  pure $ extract parse $ toUI detached
+
+runToDetached :: forall t.
+  Traversable t
+  ⇒ QueryRunner' Document (t Node)
+  -> Document
+  -> Effect (Either QueryError (t DetachedNode))
+runToDetached query dom = do
+  qRes <- doQuery query dom
+  detach qRes
+
+doQuery ∷ ∀ b. QueryRunner' Document b → Document → Effect (Either QueryError b)
+doQuery query dom = runQuery $ query dom
+
+detach ∷ ∀ a t. Traversable t ⇒ Either a (t Node) → Effect (Either a (t DetachedNode))
+detach = case _ of
+  Left l -> pure $ Left l
+  Right q -> do
+    d <- traverse toDetached q
+    pure $ Right d
+
+toUI ∷ ∀ a t. Traversable t ⇒ Either a (t DetachedNode) → Either String (t UIElement)
+toUI = case _ of
+  Left _ -> Left "could not convert to UI"
+  Right d -> fromDetachedToUI d
+
+extract ∷ ∀ t a. (t UIElement → Either String a) → Either String (t UIElement) → Either String a
+extract parsePage = case _ of
+  Left l -> Left l
+  Right ui -> parsePage ui