Skills.purs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. module LinkedIn.Page.Skills 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.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
  11. import LinkedIn.DetachedNode (toDetached)
  12. import LinkedIn.Profile.Skill (Skill)
  13. import LinkedIn.Profile.Skill as PS
  14. import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
  15. import Web.DOM (Document, Node)
  16. data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
  17. derive instance Generic (SkillsPage a) _
  18. derive instance Eq a => Eq (SkillsPage a)
  19. instance Show a => Show (SkillsPage a) where
  20. show = genericShow
  21. derive instance Functor SkillsPage
  22. instance Foldable SkillsPage where
  23. foldMap f (SkillsPage tabs) = foldMap (foldMap f) tabs
  24. foldl = \x -> foldlDefault x
  25. foldr = \x -> foldrDefault x
  26. instance Traversable SkillsPage where
  27. sequence (SkillsPage tabs) = ado
  28. ts <- sequence (map sequence tabs)
  29. in SkillsPage ts
  30. traverse = \x -> traverseDefault x
  31. querySkillsPage :: QueryRunner' Document (SkillsPage Node)
  32. querySkillsPage n = do
  33. tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
  34. pure $ SkillsPage tabs
  35. extract ∷ SkillsPage Node → Effect (Either String (NonEmptyList Skill))
  36. extract p = do
  37. detached <- traverse toDetached p
  38. let
  39. SkillsPage tabs = detached
  40. pure $ traverse PS.fromUI tabs