Projects.purs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 LinkedIn.Extractible (class Extractible)
  10. import LinkedIn.Output.Types (Output(..))
  11. import LinkedIn.Profile.Project (Project)
  12. import LinkedIn.Profile.Project as PP
  13. import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
  14. import LinkedIn.UI.Components.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
  15. import LinkedIn.UI.Elements.Types (UIElement)
  16. import Web.DOM (Document, Node)
  17. data ProjectsPage a = ProjectsPage (NonEmptyList (ArtDecoCardElement a))
  18. derive instance Generic (ProjectsPage a) _
  19. derive instance Eq a => Eq (ProjectsPage a)
  20. instance Show a => Show (ProjectsPage a) where
  21. show = genericShow
  22. derive instance Functor ProjectsPage
  23. instance Foldable ProjectsPage where
  24. foldMap f (ProjectsPage cards) = foldMap (foldMap f) cards
  25. foldl = \x -> foldlDefault x
  26. foldr = \x -> foldrDefault x
  27. instance Traversable ProjectsPage where
  28. sequence (ProjectsPage cards) = ado
  29. ts <- sequence (map sequence cards)
  30. in ProjectsPage ts
  31. traverse = \x -> traverseDefault x
  32. query :: QueryRunner' Document (ProjectsPage Node)
  33. query n = do
  34. cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
  35. pure $ ProjectsPage cards
  36. extract ∷ ProjectsPage UIElement → Either String (NonEmptyList Project)
  37. extract (ProjectsPage cards) = traverse PP.fromUI cards
  38. instance Extractible ProjectsPage where
  39. query n = do
  40. cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
  41. pure $ ProjectsPage cards
  42. extract (ProjectsPage cards) = OutProjects <$> traverse PP.fromUI cards