Parser.purs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. module LinkedIn.UI.Strings.Parser where
  2. import Prelude
  3. import Control.Alt ((<|>))
  4. import Data.Either (hush)
  5. import Data.Tuple (Tuple(..))
  6. import LinkedIn.UI.Basic.Parser (durationP, jobFlexP, medianDotSeparated, timeSpanP)
  7. import LinkedIn.UI.Strings.Types (UIString(..))
  8. import Parsing (Parser, liftMaybe, runParser)
  9. import Parsing.Combinators (try)
  10. import Parsing.String (rest)
  11. uiStringP :: Parser String UIString
  12. uiStringP = (try uiStringdotSeparatedP) <|> uiStringSingleP
  13. uiStringWithoutMedianDotP ∷ Parser String UIString
  14. uiStringWithoutMedianDotP = do
  15. s <- rest
  16. liftMaybe (\_ -> "nope") $ hush $ runParser s uiStringSingleP
  17. uiStringdotSeparatedP ∷ Parser String UIString
  18. uiStringdotSeparatedP = do
  19. Tuple s1 s2 <- medianDotSeparated
  20. let
  21. intoUiElement :: String -> Parser String UIString
  22. intoUiElement s = liftMaybe (\_ -> "could not convert to ui element") $ hush $ runParser s uiStringSingleP
  23. s1' <- intoUiElement s1
  24. s2' <- intoUiElement s2
  25. pure $ UIStringDotSeparated s1' s2'
  26. uiStringSingleP ∷ Parser String UIString
  27. uiStringSingleP = (try uiStringDurationP) <|> (try uiStringTimeSpanP) <|> (try uiStringJobFlexP) <|> uiStringPlainP
  28. uiStringDurationP ∷ Parser String UIString
  29. uiStringDurationP = UIStringDuration <$> durationP
  30. uiStringTimeSpanP ∷ Parser String UIString
  31. uiStringTimeSpanP = UIStringTimeSpan <$> timeSpanP
  32. uiStringJobFlexP ∷ Parser String UIString
  33. uiStringJobFlexP = UIStringJobFlex <$> jobFlexP
  34. uiStringPlainP ∷ Parser String UIString
  35. uiStringPlainP = UIStringPlain <$> rest