Sfoglia il codice sorgente

Create Utils and Types modules

jherve 1 anno fa
parent
commit
7e76cdee0e
4 ha cambiato i file con 91 aggiunte e 70 eliminazioni
  1. 5 70
      src/LinkedIn/ArtDecoCard.purs
  2. 20 0
      src/LinkedIn/Types.purs
  3. 65 0
      src/LinkedIn/Utils.purs
  4. 1 0
      test/ArtDecoCard.purs

+ 5 - 70
src/LinkedIn/ArtDecoCard.purs

@@ -2,31 +2,14 @@ module LinkedIn.ArtDecoCard where
 
 import Prelude
 
-import Data.Either (Either(..), hush)
+import Data.Either (hush)
 import Data.Generic.Rep (class Generic)
 import Data.List.NonEmpty (NonEmptyList)
-import Data.List.NonEmpty as NEL
-import Data.Maybe (Maybe(..), fromJust)
+import Data.Maybe (Maybe)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (sequence)
-import Effect (Effect)
-import LinkedIn (DetachedNode, toDetached)
-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)
-
-data ParseError =
-  NodeNotFoundError String
-  | NodeListNotFoundError String
-
-derive instance Generic ParseError _
-derive instance Eq ParseError
-instance Show ParseError where
-  show = genericShow
-
-type Parser a = Node → Effect (Either ParseError a)
+import LinkedIn (DetachedNode)
+import LinkedIn.Types (Parser)
+import LinkedIn.Utils (queryAndDetachMany, queryAndDetachOne, queryManyAndParse, queryOneAndParse)
 
 data ArtDecoPvsEntitySubComponent = ArtDecoPvsEntitySubComponent DetachedNode
 derive instance Generic ArtDecoPvsEntitySubComponent _
@@ -129,51 +112,3 @@ parseArtDecoCard n = do
   pure $ ado
     p <- pvs
   in ArtDecoCardElement {pvs_entity: p}
-
-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
-
-queryOne :: String -> Node -> Effect (Maybe Node)
-queryOne selector n = do
-  found <- querySelector (QuerySelector selector) $ toParentNode' n
-  pure case found of
-    Nothing -> Nothing
-    Just el -> Just $ E.toNode el
-
-queryAll :: String -> Node -> Effect (Maybe (NonEmptyList Node))
-queryAll selector n = do
-  found <- querySelectorAll (QuerySelector selector) $ toParentNode' n
-  liftA1 NEL.fromFoldable $ NL.toArray found
-
-parseDetachedNode :: Parser DetachedNode
-parseDetachedNode node = do
-  node' <- toDetached node
-  pure $ Right node'
-
-queryAndDetachOne ∷ String -> Parser DetachedNode
-queryAndDetachOne selector n = queryOneAndParse selector parseDetachedNode n
-
-queryAndDetachMany ∷ String -> Parser (NonEmptyList DetachedNode)
-queryAndDetachMany selector n = queryManyAndParse selector parseDetachedNode n
-
-queryOneAndParse ∷ ∀ a. String → Parser a → Parser a
-queryOneAndParse selector parser n = do
-  selected <- queryOne selector n
-
-  case selected of
-    Nothing -> pure $ Left $ NodeNotFoundError selector
-    Just node -> parser node
-
-queryManyAndParse ∷ ∀ a. String → Parser a → Parser (NonEmptyList a)
-queryManyAndParse selector parser n = do
-  selected <- queryAll selector n
-  case selected of
-    Nothing -> pure $ Left $ NodeListNotFoundError selector
-    Just nodes -> do
-      nodes' <- sequence $ map parser nodes :: Effect (NonEmptyList((Either ParseError a)))
-      pure $ sequence nodes'

+ 20 - 0
src/LinkedIn/Types.purs

@@ -0,0 +1,20 @@
+module LinkedIn.Types where
+
+import Prelude
+import Data.Either (Either)
+import Effect (Effect)
+import Data.Generic.Rep (class Generic)
+import Data.Show.Generic (genericShow)
+import Web.DOM (Node)
+
+
+data ParseError =
+  NodeNotFoundError String
+  | NodeListNotFoundError String
+
+derive instance Generic ParseError _
+derive instance Eq ParseError
+instance Show ParseError where
+  show = genericShow
+
+type Parser a = Node → Effect (Either ParseError a)

+ 65 - 0
src/LinkedIn/Utils.purs

@@ -0,0 +1,65 @@
+module LinkedIn.Utils where
+
+import Prelude
+
+import Data.Either (Either(..))
+import Data.List.NonEmpty (NonEmptyList)
+import Data.List.NonEmpty as NEL
+import Data.Maybe (Maybe(..), fromJust)
+import Data.Traversable (sequence)
+import Effect (Effect)
+import LinkedIn (DetachedNode, toDetached)
+import LinkedIn.Types (ParseError(..), Parser)
+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
+
+queryOne :: String -> Node -> Effect (Maybe Node)
+queryOne selector n = do
+  found <- querySelector (QuerySelector selector) $ toParentNode' n
+  pure case found of
+    Nothing -> Nothing
+    Just el -> Just $ E.toNode el
+
+queryAll :: String -> Node -> Effect (Maybe (NonEmptyList Node))
+queryAll selector n = do
+  found <- querySelectorAll (QuerySelector selector) $ toParentNode' n
+  liftA1 NEL.fromFoldable $ NL.toArray found
+
+parseDetachedNode :: Parser DetachedNode
+parseDetachedNode node = do
+  node' <- toDetached node
+  pure $ Right node'
+
+queryAndDetachOne ∷ String -> Parser DetachedNode
+queryAndDetachOne selector n = queryOneAndParse selector parseDetachedNode n
+
+queryAndDetachMany ∷ String -> Parser (NonEmptyList DetachedNode)
+queryAndDetachMany selector n = queryManyAndParse selector parseDetachedNode n
+
+queryOneAndParse ∷ ∀ a. String → Parser a → Parser a
+queryOneAndParse selector parser n = do
+  selected <- queryOne selector n
+
+  case selected of
+    Nothing -> pure $ Left $ NodeNotFoundError selector
+    Just node -> parser node
+
+queryManyAndParse ∷ ∀ a. String → Parser a → Parser (NonEmptyList a)
+queryManyAndParse selector parser n = do
+  selected <- queryAll selector n
+  case selected of
+    Nothing -> pure $ Left $ NodeListNotFoundError selector
+    Just nodes -> do
+      nodes' <- sequence $ map parser nodes :: Effect (NonEmptyList((Either ParseError a)))
+      pure $ sequence nodes'

+ 1 - 0
test/ArtDecoCard.purs

@@ -11,6 +11,7 @@ import Data.Maybe (Maybe(..), isJust)
 import Data.NonEmpty (NonEmpty(..))
 import Effect (Effect)
 import LinkedIn (DetachedNode(..), LinkedInUIElement(..), getArtDecoCards)
+import LinkedIn.Types (ParseError)
 import Node.JsDom (jsDomFromFile)
 import Partial.Unsafe (unsafePartial)
 import Test.Assert (assert, assertEqual)