ArtDeco.purs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. module LinkedIn.ArtDeco where
  2. import Prelude
  3. import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
  4. import Data.Generic.Rep (class Generic)
  5. import Data.Lens (Lens', Traversal', lens', traversed)
  6. import Data.Lens.Record (prop)
  7. import Data.List.NonEmpty (NonEmptyList)
  8. import Data.Maybe (Maybe)
  9. import Data.Show.Generic (genericShow)
  10. import Data.Traversable (class Traversable, sequence, traverseDefault)
  11. import Data.Tuple (Tuple(..))
  12. import LinkedIn.QueryRunner (QueryRunner, ignoreNotFound, queryAll, queryOne, subQueryMany, subQueryOne)
  13. import Type.Proxy (Proxy(..))
  14. import Web.DOM (Node)
  15. data ArtDecoPvsEntity a = ArtDecoPvsEntity {
  16. side :: Unit,
  17. center :: ArtDecoCenter a
  18. }
  19. data ArtDecoCenter a = ArtDecoCenter {
  20. header :: ArtDecoCenterHeader a,
  21. content :: ArtDecoCenterContent a
  22. }
  23. data ArtDecoCenterHeader a = ArtDecoCenterHeader {
  24. bold :: a,
  25. normal :: Maybe a,
  26. light :: Maybe (NonEmptyList a)
  27. }
  28. data ArtDecoCenterContent a = ArtDecoCenterContent (NonEmptyList (ArtDecoPvsEntitySubComponent a))
  29. data ArtDecoPvsEntitySubComponent a = ArtDecoPvsEntitySubComponent (Maybe a)
  30. derive instance Generic (ArtDecoPvsEntitySubComponent a) _
  31. derive instance Eq a => Eq (ArtDecoPvsEntitySubComponent a)
  32. instance Show a => Show (ArtDecoPvsEntitySubComponent a) where
  33. show = genericShow
  34. derive instance Functor ArtDecoPvsEntitySubComponent
  35. instance Foldable ArtDecoPvsEntitySubComponent where
  36. foldMap f (ArtDecoPvsEntitySubComponent sc) = foldMap f sc
  37. foldl = \x -> foldlDefault x
  38. foldr = \x -> foldrDefault x
  39. instance Traversable ArtDecoPvsEntitySubComponent where
  40. sequence (ArtDecoPvsEntitySubComponent subComponents) = ado
  41. sc <- sequence subComponents
  42. in ArtDecoPvsEntitySubComponent sc
  43. traverse = \x -> traverseDefault x
  44. derive instance Generic (ArtDecoCenterContent a) _
  45. derive instance Eq a => Eq(ArtDecoCenterContent a)
  46. instance Show a => Show(ArtDecoCenterContent a) where
  47. show = genericShow
  48. derive instance Functor ArtDecoCenterContent
  49. instance Foldable ArtDecoCenterContent where
  50. foldMap f (ArtDecoCenterContent c) = foldMap (foldMap f) c
  51. foldl = \x -> foldlDefault x
  52. foldr = \x -> foldrDefault x
  53. instance Traversable ArtDecoCenterContent where
  54. sequence (ArtDecoCenterContent center) = ado
  55. c <- sequence (map sequence center)
  56. in ArtDecoCenterContent c
  57. traverse = \x -> traverseDefault x
  58. derive instance Generic (ArtDecoCenterHeader a) _
  59. derive instance Eq a => Eq(ArtDecoCenterHeader a)
  60. instance Show a => Show(ArtDecoCenterHeader a) where
  61. show = genericShow
  62. derive instance Functor ArtDecoCenterHeader
  63. instance Foldable ArtDecoCenterHeader where
  64. foldMap f (ArtDecoCenterHeader {bold, normal, light}) = f bold <> foldMap f normal <> foldMap (foldMap f) light
  65. foldl = \x -> foldlDefault x
  66. foldr = \x -> foldrDefault x
  67. instance Traversable ArtDecoCenterHeader where
  68. sequence (ArtDecoCenterHeader {bold, normal, light}) = ado
  69. b <- bold
  70. n <- sequence normal
  71. l <- sequence (map sequence light)
  72. in ArtDecoCenterHeader {bold: b, normal: n, light: l}
  73. traverse = \x -> traverseDefault x
  74. derive instance Generic (ArtDecoCenter a) _
  75. derive instance Eq a => Eq(ArtDecoCenter a)
  76. instance Show a => Show(ArtDecoCenter a) where
  77. show = genericShow
  78. derive instance Functor ArtDecoCenter
  79. instance Foldable ArtDecoCenter where
  80. foldMap f (ArtDecoCenter {header, content}) = foldMap f header <> foldMap f content
  81. foldl = \x -> foldlDefault x
  82. foldr = \x -> foldrDefault x
  83. instance Traversable ArtDecoCenter where
  84. sequence (ArtDecoCenter {header, content}) = ado
  85. h <- sequence header
  86. c <- sequence content
  87. in ArtDecoCenter {header: h, content: c}
  88. traverse = \x -> traverseDefault x
  89. derive instance Generic (ArtDecoPvsEntity a) _
  90. derive instance Eq a => Eq(ArtDecoPvsEntity a)
  91. instance Show a => Show(ArtDecoPvsEntity a) where
  92. show = genericShow
  93. derive instance Functor ArtDecoPvsEntity
  94. instance Foldable ArtDecoPvsEntity where
  95. foldMap f (ArtDecoPvsEntity {side: _, center}) = foldMap f center
  96. foldl = \x -> foldlDefault x
  97. foldr = \x -> foldrDefault x
  98. instance Traversable ArtDecoPvsEntity where
  99. sequence (ArtDecoPvsEntity {side, center}) = ado
  100. s <- pure side
  101. c <- sequence center
  102. in ArtDecoPvsEntity {side: s, center: c}
  103. traverse = \x -> traverseDefault x
  104. queryArtDecoPvsEntitySubComponent ∷ QueryRunner (ArtDecoPvsEntitySubComponent Node)
  105. queryArtDecoPvsEntitySubComponent n = do
  106. content <- ignoreNotFound $ queryOne "span[aria-hidden=true]" n
  107. pure $ ArtDecoPvsEntitySubComponent content
  108. queryArtDecoCenterContent ∷ QueryRunner (ArtDecoCenterContent Node)
  109. queryArtDecoCenterContent n = do
  110. sc <- subQueryMany queryArtDecoPvsEntitySubComponent ":scope > ul > li" n
  111. pure $ ArtDecoCenterContent sc
  112. queryArtDecoCenterHeader ∷ QueryRunner (ArtDecoCenterHeader Node)
  113. queryArtDecoCenterHeader n = do
  114. bold <- queryOne ":scope div.t-bold > span[aria-hidden=true]" n
  115. normal <-
  116. ignoreNotFound $
  117. queryOne ":scope span.t-normal:not(t-black--light) > span[aria-hidden=true]" n
  118. light <-
  119. ignoreNotFound $
  120. queryAll ":scope span.t-black--light > span[aria-hidden=true]" n
  121. pure $ ArtDecoCenterHeader {bold, normal, light}
  122. queryArtDecoCenter ∷ QueryRunner (ArtDecoCenter Node)
  123. queryArtDecoCenter n = do
  124. header <- subQueryOne queryArtDecoCenterHeader ":scope > div" n
  125. content <- subQueryOne queryArtDecoCenterContent ":scope > div.pvs-entity__sub-components" n
  126. pure $ ArtDecoCenter {header, content}
  127. queryArtDecoPvsEntity ∷ QueryRunner (ArtDecoPvsEntity Node)
  128. queryArtDecoPvsEntity n = do
  129. center <- subQueryOne queryArtDecoCenter ":scope > div.display-flex" n
  130. pure $ ArtDecoPvsEntity {side: unit, center}
  131. _pvs_entity :: forall a. Lens' (ArtDecoPvsEntity a) { center ∷ ArtDecoCenter a , side ∷ Unit }
  132. _pvs_entity = lens'
  133. \(ArtDecoPvsEntity pvs) -> Tuple pvs \pvs' -> ArtDecoPvsEntity pvs'
  134. _center :: forall a. Lens' (ArtDecoCenter a) { content ∷ ArtDecoCenterContent a , header ∷ ArtDecoCenterHeader a }
  135. _center = lens'
  136. \(ArtDecoCenter center) -> Tuple center \center' -> ArtDecoCenter center'
  137. _header :: forall a. Lens' (ArtDecoCenterHeader a) { bold ∷ a , light ∷ Maybe (NonEmptyList a) , normal ∷ Maybe a }
  138. _header = lens' \(ArtDecoCenterHeader h) -> Tuple h \h' -> ArtDecoCenterHeader h'
  139. _content :: forall a. Lens' (ArtDecoCenterContent a) (NonEmptyList (ArtDecoPvsEntitySubComponent a))
  140. _content = lens' \(ArtDecoCenterContent cs) -> Tuple cs \cs' -> ArtDecoCenterContent cs'
  141. _sub_component :: forall a. Lens' (ArtDecoPvsEntitySubComponent a) (Maybe a)
  142. _sub_component = lens' \(ArtDecoPvsEntitySubComponent s) -> Tuple s \s' -> ArtDecoPvsEntitySubComponent s'
  143. _pvs_to_header :: forall a. Lens' (ArtDecoPvsEntity a) { bold ∷ a , light ∷ Maybe (NonEmptyList a) , normal ∷ Maybe a }
  144. _pvs_to_header = _pvs_entity
  145. <<< prop (Proxy :: Proxy "center")
  146. <<< _center
  147. <<< prop (Proxy :: Proxy "header")
  148. <<< _header
  149. _pvs_to_subcomponents ∷ ∀ a. Traversal' (ArtDecoPvsEntity a) (Maybe a)
  150. _pvs_to_subcomponents = _pvs_entity
  151. <<< prop (Proxy :: Proxy "center")
  152. <<< _center
  153. <<< prop (Proxy :: Proxy "content")
  154. <<< _content
  155. <<< traversed
  156. <<< _sub_component
  157. _pvs_to_header_bold :: forall a. Lens' (ArtDecoPvsEntity a) a
  158. _pvs_to_header_bold = _pvs_to_header <<< prop (Proxy :: Proxy "bold")
  159. _pvs_to_header_normal :: forall a. Lens' (ArtDecoPvsEntity a) (Maybe a)
  160. _pvs_to_header_normal = _pvs_to_header <<< prop (Proxy :: Proxy "normal")
  161. _pvs_to_header_light :: forall a. Lens' (ArtDecoPvsEntity a) (Maybe (NonEmptyList a))
  162. _pvs_to_header_light = _pvs_to_header <<< prop (Proxy :: Proxy "light")