Browse Source

Push fromNodeToDetached call to highest level

jherve 1 year ago
parent
commit
5c268f4f52

+ 15 - 5
src/Content.purs

@@ -14,7 +14,9 @@ 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.Profile.Utils (fromDetachedToUI, fromNodeToDetached)
 import LinkedIn.QueryRunner (QueryRunner', runQuery)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 
 main :: Effect Unit
@@ -30,11 +32,19 @@ main = do
 
   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 <- fromNodeToDetached n
+  pure $ case fromDetachedToUI d of
+      Left l -> Left l
+      Right ui -> parsePageUI ui
+
 runQueryAndExtract ∷
-  ∀ f1 a.
-  Show a
-  ⇒ QueryRunner' Document (f1 Node)
-  → (f1 Node → Effect (Either String a))
+  ∀ t a.
+  Traversable t
+  => Show a
+  ⇒ QueryRunner' Document (t Node)
+  → (t UIElement → Either String a)
   → Document
   → Effect Unit
 runQueryAndExtract query extract dom = do
@@ -42,7 +52,7 @@ runQueryAndExtract query extract dom = do
   case n of
     Left l' -> logShow l'
     Right q -> do
-      extracted <- extract q
+      extracted <- (extractData extract) q
       logShow extracted
 
 runQueryAndDetach ∷

+ 4 - 10
src/LinkedIn/Page/JobOffer.purs

@@ -6,14 +6,12 @@ import Data.Either (Either)
 import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
 import Data.Generic.Rep (class Generic)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
-import Effect (Effect)
-import LinkedIn.DetachedNode (toDetached)
+import Data.Traversable (class Traversable, sequence, traverseDefault)
 import LinkedIn.Jobs.JobOffer (JobOffer)
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryOne)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 
 data JobOfferPage a = JobOfferPage (JobsUnifiedTopCardElement a)
@@ -42,9 +40,5 @@ query n = do
   card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n
   pure $ JobOfferPage card
 
-extract ∷ JobOfferPage Node → Effect (Either String JobOffer)
-extract p = do
-  detached <- traverse toDetached p
-  let
-    JobOfferPage tabs = detached
-  pure $ (JJO.fromUI <=< fromDetachedToUI) tabs
+extract ∷ JobOfferPage UIElement → Either String JobOffer
+extract (JobOfferPage tabs) = JJO.fromUI tabs

+ 3 - 9
src/LinkedIn/Page/Projects.purs

@@ -8,13 +8,11 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
-import Effect (Effect)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
-import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project as PP
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 
 data ProjectsPage a = ProjectsPage (NonEmptyList (ArtDecoCardElement a))
@@ -43,9 +41,5 @@ query n = do
   cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
   pure $ ProjectsPage cards
 
-extract ∷ ProjectsPage Node → Effect (Either String (NonEmptyList Project))
-extract p = do
-  detached <- traverse toDetached p
-  let
-    ProjectsPage cards = detached
-  pure $ traverse (PP.fromUI <=< fromDetachedToUI) cards
+extract ∷ ProjectsPage UIElement → Either String (NonEmptyList Project)
+extract (ProjectsPage cards) = traverse PP.fromUI cards

+ 3 - 9
src/LinkedIn/Page/Skills.purs

@@ -8,13 +8,11 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
-import Effect (Effect)
 import LinkedIn.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
-import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Skill (Skill)
 import LinkedIn.Profile.Skill as PS
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 
 data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
@@ -43,9 +41,5 @@ query n = do
   tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
   pure $ SkillsPage tabs
 
-extract ∷ SkillsPage Node → Effect (Either String (NonEmptyList Skill))
-extract p = do
-  detached <- traverse toDetached p
-  let
-    SkillsPage tabs = detached
-  pure $ traverse (PS.fromUI <=< fromDetachedToUI) tabs
+extract ∷ SkillsPage UIElement → Either String (NonEmptyList Skill)
+extract (SkillsPage tabs) = traverse PS.fromUI tabs

+ 3 - 9
src/LinkedIn/Page/WorkExperiences.purs

@@ -8,13 +8,11 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
-import Effect (Effect)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
-import LinkedIn.DetachedNode (toDetached)
-import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.Profile.WorkExperience (WorkExperience)
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
+import LinkedIn.UIElements.Types (UIElement)
 import Web.DOM (Document, Node)
 
 data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
@@ -43,9 +41,5 @@ query n = do
   cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
   pure $ WorkExperiencesPage cards
 
-extract ∷ WorkExperiencesPage Node → Effect (Either String (NonEmptyList WorkExperience))
-extract p = do
-  detached <- traverse toDetached p
-  let
-    WorkExperiencesPage cards = detached
-  pure $ traverse (PWE.fromUI <=< fromDetachedToUI) cards
+extract ∷ WorkExperiencesPage UIElement → Either String (NonEmptyList WorkExperience)
+extract (WorkExperiencesPage cards) = traverse PWE.fromUI cards

+ 6 - 1
src/LinkedIn/Profile/Utils.purs

@@ -6,10 +6,15 @@ import Control.Alt ((<|>))
 import Data.Either (Either(..))
 import Data.Maybe (Maybe(..))
 import Data.Traversable (class Traversable, traverse)
-import LinkedIn.DetachedNode (DetachedNode(..))
+import Effect (Effect)
+import LinkedIn.DetachedNode (DetachedNode(..), toDetached)
 import LinkedIn.UIElements.Parser (uiStringP)
 import LinkedIn.UIElements.Types (UIElement(..))
 import Parsing (ParseError(..), initialPos, runParser)
+import Web.DOM (Node)
+
+fromNodeToDetached ∷ ∀ t. Traversable t ⇒ t Node → Effect (t DetachedNode)
+fromNodeToDetached = traverse toDetached
 
 fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
 fromDetachedToUI el = case traverse toUIElement el of