, compareNameComponent
) where
+import Control.Applicative
import Control.Monad
import Data.Function
import Data.List
return = Ok
fail = Bad
+instance Functor Result where
+ fmap _ (Bad msg) = Bad msg
+ fmap fn (Ok val) = Ok (fn val)
+
instance MonadPlus Result where
mzero = Bad "zero Result when used as MonadPlus"
-- for mplus, when we 'add' two Bad values, we concatenate their
(Bad _) `mplus` x = x
x@(Ok _) `mplus` _ = x
+instance Applicative Result where
+ pure = Ok
+ (Bad f) <*> _ = Bad f
+ _ <*> (Bad x) = Bad x
+ (Ok f) <*> (Ok x) = Ok $ f x
+
-- | Simple checker for whether a 'Result' is OK.
isOk :: Result a -> Bool
isOk (Ok _) = True