Projects.purs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. module LinkedIn.Page.Projects where
  2. import Prelude
  3. import Data.Either (Either)
  4. import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
  5. import Data.Generic.Rep (class Generic)
  6. import Data.List.Types (NonEmptyList)
  7. import Data.Show.Generic (genericShow)
  8. import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
  9. import Effect (Effect)
  10. import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
  11. import LinkedIn.DetachedNode (toDetached)
  12. import LinkedIn.Profile.Project (Project)
  13. import LinkedIn.Profile.Project as PP
  14. import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
  15. import Web.DOM (Document, Node)
  16. data ProjectsPage a = ProjectsPage (NonEmptyList (ArtDecoCardElement a))
  17. derive instance Generic (ProjectsPage a) _
  18. derive instance Eq a => Eq (ProjectsPage a)
  19. instance Show a => Show (ProjectsPage a) where
  20. show = genericShow
  21. derive instance Functor ProjectsPage
  22. instance Foldable ProjectsPage where
  23. foldMap f (ProjectsPage cards) = foldMap (foldMap f) cards
  24. foldl = \x -> foldlDefault x
  25. foldr = \x -> foldrDefault x
  26. instance Traversable ProjectsPage where
  27. sequence (ProjectsPage cards) = ado
  28. ts <- sequence (map sequence cards)
  29. in ProjectsPage ts
  30. traverse = \x -> traverseDefault x
  31. query :: QueryRunner' Document (ProjectsPage Node)
  32. query n = do
  33. cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
  34. pure $ ProjectsPage cards
  35. extract ∷ ProjectsPage Node → Effect (Either String (NonEmptyList Project))
  36. extract p = do
  37. detached <- traverse toDetached p
  38. let
  39. ProjectsPage cards = detached
  40. pure $ traverse PP.fromUI cards