-- |
-- Custom Error monad.

module Data.Autolib.Transport.Error (
    Error (..)
) where

import Control.Applicative
import Control.Monad
import qualified Control.Monad.Fail as Fail

-- | 'Error a' is isomorphic to @Either String a@ but could be extended
-- to encode more error conditions.
data Error a = Error String | Result a
  deriving (Error a -> Error a -> Bool
(Error a -> Error a -> Bool)
-> (Error a -> Error a -> Bool) -> Eq (Error a)
forall a. Eq a => Error a -> Error a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Error a -> Error a -> Bool
== :: Error a -> Error a -> Bool
$c/= :: forall a. Eq a => Error a -> Error a -> Bool
/= :: Error a -> Error a -> Bool
Eq, Int -> Error a -> ShowS
[Error a] -> ShowS
Error a -> String
(Int -> Error a -> ShowS)
-> (Error a -> String) -> ([Error a] -> ShowS) -> Show (Error a)
forall a. Show a => Int -> Error a -> ShowS
forall a. Show a => [Error a] -> ShowS
forall a. Show a => Error a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Error a -> ShowS
showsPrec :: Int -> Error a -> ShowS
$cshow :: forall a. Show a => Error a -> String
show :: Error a -> String
$cshowList :: forall a. Show a => [Error a] -> ShowS
showList :: [Error a] -> ShowS
Show)

instance Monad Error where
    Error String
e  >>= :: forall a b. Error a -> (a -> Error b) -> Error b
>>= a -> Error b
_ = String -> Error b
forall a. String -> Error a
Error String
e
    Result a
x >>= a -> Error b
f = a -> Error b
f a
x
    return :: forall a. a -> Error a
return = a -> Error a
forall a. a -> Error a
Result

instance Fail.MonadFail Error where
    fail :: forall a. String -> Error a
fail = String -> Error a
forall a. String -> Error a
Error

instance Functor Error where
    fmap :: forall a b. (a -> b) -> Error a -> Error b
fmap = (a -> b) -> Error a -> Error b
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM

instance Applicative Error where
    pure :: forall a. a -> Error a
pure  = a -> Error a
forall a. a -> Error a
forall (m :: * -> *) a. Monad m => a -> m a
return
    <*> :: forall a b. Error (a -> b) -> Error a -> Error b
(<*>) = Error (a -> b) -> Error a -> Error b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap

instance Alternative Error where
    empty :: forall a. Error a
empty = String -> Error a
forall a. String -> Error a
Error String
"Control.Alternative.empty"
    Result a
l <|> :: forall a. Error a -> Error a -> Error a
<|> Error a
_ = a -> Error a
forall a. a -> Error a
Result a
l
    Error a
_ <|> Error a
r = Error a
r