module Language.Haskell.Formatter.Result
(Result, toEither, fatalError, fatalAssertionError) where
import qualified Control.Applicative as Applicative
import qualified Control.Monad as Monad
import qualified Language.Haskell.Formatter.Error as Error
newtype Result a = Result (Either Error.Error a)
deriving (Eq, Ord, Show)
instance Functor Result where
fmap = Monad.liftM
instance Applicative.Applicative Result where
pure = return
(<*>) = Monad.ap
instance Monad Result where
return = Result . return
Result result >>= action = Result $ result >>= toEither . action
toEither :: Result a -> Either Error.Error a
toEither (Result result) = result
fatalError :: Error.Error -> Result a
fatalError = Result . Left
fatalAssertionError :: String -> Result a
fatalAssertionError = fatalError . Error.createAssertionError