packages feed

simple-parser-0.2.0: src/SimpleParser/Result.hs

module SimpleParser.Result
  ( ParseResult (..)
  , ParseValue (..)
  , parseSuccessResult
  , parseErrorResult
  , parseValue
  ) where

-- | Strict 'Either' for parse results.
data ParseValue e a =
    ParseError !e
  | ParseSuccess !a
  deriving (Eq, Show, Functor, Foldable, Traversable)

parseValue :: (e -> r) -> (a -> r) -> ParseValue e a -> r
parseValue onError onSuccess value =
  case value of
    ParseError e -> onError e
    ParseSuccess a -> onSuccess a

-- | Strict pair of parse result and state at the time it was yielded.
data ParseResult e s a = ParseResult
  { prValue :: !(ParseValue e a)
  , prState :: !s
  } deriving (Eq, Show, Functor, Foldable, Traversable)

parseSuccessResult :: a -> s -> ParseResult e s a
parseSuccessResult = ParseResult . ParseSuccess

parseErrorResult :: e -> s -> ParseResult e s a
parseErrorResult = ParseResult . ParseError