فهرست منبع

Refactor high-level code into a LinkedIn module

jherve 1 سال پیش
والد
کامیت
598cb429c1
2فایلهای تغییر یافته به همراه57 افزوده شده و 50 حذف شده
  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 Prelude
 
 
 import Browser.DOM (getBrowserDom)
 import Browser.DOM (getBrowserDom)
-import Data.Either (Either(..), hush)
-import Data.Maybe (Maybe(..))
-import Data.Traversable (class Traversable, traverse)
 import Effect (Effect)
 import Effect (Effect)
 import Effect.Class.Console (logShow)
 import Effect.Class.Console (logShow)
 import Effect.Console (log)
 import Effect.Console (log)
-import LinkedIn.DetachedNode (DetachedNode, toDetached)
+import LinkedIn (run, runToDetached)
 import LinkedIn.Page.JobOffer as PageJ
 import LinkedIn.Page.JobOffer as PageJ
 import LinkedIn.Page.Projects as PageP
 import LinkedIn.Page.Projects as PageP
 import LinkedIn.Page.Skills as PageS
 import LinkedIn.Page.Skills as PageS
 import LinkedIn.Page.WorkExperiences as PageWE
 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 :: Effect Unit
 main = do
 main = do
@@ -25,46 +18,9 @@ main = do
 
 
   dom <- getBrowserDom
   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