module Text.ParserCombinators.Poly.Result
  ( -- * The parsing result type
    Result(..)  -- A parsing result type, with Success, Failure, and Commitment.
  , resultToEither
  ) where

-- | A return type like Either, that distinguishes not only between
--   right and wrong answers, but also has commitment, so that a failure
--   cannot be undone.  This should only be used for writing very primitive
--   parsers - really it is an internal detail of the library.
--   The z type is the remaining unconsumed input.
data Result z a = Success   z a
                | Failure   z String
                | Committed (Result z a)

instance Functor (Result z) where
    fmap f (Success z a) = Success z (f a)
    fmap f (Failure z e) = Failure z e
    fmap f (Committed r) = Committed (fmap f r)

-- | Convert a Result to an Either, paired with the remaining unconsumed input.
resultToEither :: Result z a -> (Either String a, z)
resultToEither (Success z a)  =  (Right a, z)
resultToEither (Failure z e)  =  (Left e, z)
resultToEither (Committed r)  =  resultToEither r