svgutils-0.1: Data/SVG/Internal/Fail.hs
module Data.SVG.Internal.Fail where
import Control.Applicative
import Control.Monad
import Data.Maybe (listToMaybe)
data FailM a = Fail String | OK a
instance Functor FailM where
fmap _ (Fail x) = Fail x
fmap f (OK x) = OK (f x)
instance Monad FailM where
return = OK
fail = Fail
(>>=) (Fail x) _ = Fail x
(>>=) (OK x) f = f x
instance Applicative FailM where
(<*>) = ap
pure = return
runFail :: FailM a -> Either String a
runFail (Fail x) = Left x
runFail (OK x) = Right x
maybeFail :: String -> Maybe a -> FailM a
maybeFail e = maybe (Fail e) OK
maybeRead :: Read a => String -> Maybe a
maybeRead = fmap fst . listToMaybe . reads