forked from GitHub/gf-core
* The following modules are no longer used and have been removed completely: GF.Compile.Compute.ConcreteLazy GF.Compile.Compute.ConcreteStrict GF.Compile.Refresh * The STM monad has been commented out. It was only used in GF.Compile.SubExpOpt, where could be replaced with a plain State monad, since no error handling was needed. One of the functions was hardwired to the Err monad, but did in fact not use error handling, so it was turned into a pure function. * The function errVal has been renamed to fromErr (since it is analogous to fromMaybe). * Replaced 'fail' with 'raise' and 'return ()' with 'done' in a few places. * Some additional old code that was already commented out has been removed.
58 lines
1.3 KiB
Haskell
58 lines
1.3 KiB
Haskell
----------------------------------------------------------------------
|
|
-- |
|
|
-- Module : ErrM
|
|
-- Maintainer : AR
|
|
-- Stability : (stable)
|
|
-- Portability : (portable)
|
|
--
|
|
-- > CVS $Date: 2005/04/21 16:22:00 $
|
|
-- > CVS $Author: bringert $
|
|
-- > CVS $Revision: 1.5 $
|
|
--
|
|
-- hack for BNFC generated files. AR 21/9/2003
|
|
-----------------------------------------------------------------------------
|
|
|
|
module GF.Data.ErrM where
|
|
|
|
import Control.Monad (MonadPlus(..),ap)
|
|
import Control.Applicative
|
|
|
|
-- | Like 'Maybe' type with error msgs
|
|
data Err a = Ok a | Bad String
|
|
deriving (Read, Show, Eq)
|
|
|
|
-- | Analogue of 'maybe'
|
|
err :: (String -> b) -> (a -> b) -> Err a -> b
|
|
err d f e = case e of
|
|
Ok a -> f a
|
|
Bad s -> d s
|
|
|
|
-- | Analogue of 'fromMaybe'
|
|
fromErr :: a -> Err a -> a
|
|
fromErr a = err (const a) id
|
|
|
|
instance Monad Err where
|
|
return = Ok
|
|
fail = Bad
|
|
Ok a >>= f = f a
|
|
Bad s >>= f = Bad s
|
|
|
|
-- | added 2\/10\/2003 by PEB
|
|
instance Functor Err where
|
|
fmap f (Ok a) = Ok (f a)
|
|
fmap f (Bad s) = Bad s
|
|
|
|
instance Applicative Err where
|
|
pure = return
|
|
(<*>) = ap
|
|
|
|
-- | added by KJ
|
|
instance MonadPlus Err where
|
|
mzero = Bad "error (no reason given)"
|
|
mplus (Ok a) _ = Ok a
|
|
mplus (Bad s) b = b
|
|
|
|
instance Alternative Err where
|
|
empty = mzero
|
|
(<|>) = mplus
|