Utils.purs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. module LinkedIn.Profile.Utils where
  2. import Prelude
  3. import Data.Either (Either, hush)
  4. import Data.Foldable (class Foldable, findMap)
  5. import Data.List (List)
  6. import Data.List as L
  7. import Data.Maybe (Maybe(..))
  8. import LinkedIn (DetachedNode(..))
  9. import LinkedIn.UIElements.Parser (uiElementP)
  10. import LinkedIn.UIElements.Types (UIElement(..))
  11. import Parsing (runParser, ParseError)
  12. maybeGetInList ::
  13. ∀ a. (UIElement → Maybe a)
  14. -> List (Either ParseError UIElement)
  15. -> Int
  16. -> Maybe a
  17. maybeGetInList extract idx list = L.index idx list >>= hush >>= extract
  18. maybeExtractFromMaybe ∷
  19. ∀ a. (UIElement → Maybe a)
  20. → Maybe (Either ParseError UIElement)
  21. → Maybe a
  22. maybeExtractFromMaybe extract maybeNode = maybeNode >>= hush >>= extract
  23. maybeFindInMaybeNEL ∷
  24. ∀ a f. Foldable f ⇒
  25. (UIElement → Maybe a)
  26. → Maybe (f (Either ParseError UIElement))
  27. → Maybe a
  28. maybeFindInMaybeNEL extract = case _ of
  29. Just nel -> findMap (hush >>> (extract =<< _)) nel
  30. Nothing -> Nothing
  31. toUIElement ∷ DetachedNode → Either ParseError UIElement
  32. toUIElement (DetachedElement {content}) = runParser content uiElementP
  33. toUIElement (DetachedComment str) = runParser str uiElementP
  34. toUIElement (DetachedText str) = runParser str uiElementP
  35. toUIElement (DetachedA {content, href}) = map toLink $ runParser content uiElementP
  36. where toLink ui = UILink href ui