packages feed

saturn-1.1.0.0: source/library/Saturn/Unstable/Parse.hs

{-# LANGUAGE FlexibleContexts #-}

module Saturn.Unstable.Parse where

import qualified Data.Text as Text
import qualified Data.Text.Lazy as LazyText
import qualified Saturn.Unstable.Type.Schedule as Schedule
import qualified Text.Parsec as Parsec

-- | Parses a lazy 'LazyText.Text' value into a 'Schedule.Schedule'. See
-- 'fromText' for details.
fromLazyText :: LazyText.Text -> Either Parsec.ParseError Schedule.Schedule
fromLazyText = Parsec.parse parsec ""

-- | Parses a 'String' into a 'Schedule.Schedule'. See 'fromText' for details.
fromString :: String -> Either Parsec.ParseError Schedule.Schedule
fromString = Parsec.parse parsec ""

-- | Parses a strict 'Text.Text' value into a 'Schedule.Schedule'. The input
-- should have five fields, each separated by at least one space. Leading and
-- trailing spaces are allowed.
fromText :: Text.Text -> Either Parsec.ParseError Schedule.Schedule
fromText = Parsec.parse parsec ""

parsec :: (Parsec.Stream s m Char) => Parsec.ParsecT s u m Schedule.Schedule
parsec =
  Parsec.skipMany (Parsec.char ' ')
    *> Schedule.parsec
    <* Parsec.skipMany (Parsec.char ' ')
    <* Parsec.eof