{-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE Safe #-} {-# LANGUAGE StrictData #-} module Tokstyle.Result where import Control.DeepSeq (NFData) import GHC.Generics (Generic) data Result a = Success a | Failure String deriving (ReadPrec [Result a] ReadPrec (Result a) Int -> ReadS (Result a) ReadS [Result a] (Int -> ReadS (Result a)) -> ReadS [Result a] -> ReadPrec (Result a) -> ReadPrec [Result a] -> Read (Result a) forall a. Read a => ReadPrec [Result a] forall a. Read a => ReadPrec (Result a) forall a. Read a => Int -> ReadS (Result a) forall a. Read a => ReadS [Result a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a readListPrec :: ReadPrec [Result a] $creadListPrec :: forall a. Read a => ReadPrec [Result a] readPrec :: ReadPrec (Result a) $creadPrec :: forall a. Read a => ReadPrec (Result a) readList :: ReadS [Result a] $creadList :: forall a. Read a => ReadS [Result a] readsPrec :: Int -> ReadS (Result a) $creadsPrec :: forall a. Read a => Int -> ReadS (Result a) Read, Int -> Result a -> ShowS [Result a] -> ShowS Result a -> String (Int -> Result a -> ShowS) -> (Result a -> String) -> ([Result a] -> ShowS) -> Show (Result a) forall a. Show a => Int -> Result a -> ShowS forall a. Show a => [Result a] -> ShowS forall a. Show a => Result a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Result a] -> ShowS $cshowList :: forall a. Show a => [Result a] -> ShowS show :: Result a -> String $cshow :: forall a. Show a => Result a -> String showsPrec :: Int -> Result a -> ShowS $cshowsPrec :: forall a. Show a => Int -> Result a -> ShowS Show, Result a -> Result a -> Bool (Result a -> Result a -> Bool) -> (Result a -> Result a -> Bool) -> Eq (Result a) forall a. Eq a => Result a -> Result a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Result a -> Result a -> Bool $c/= :: forall a. Eq a => Result a -> Result a -> Bool == :: Result a -> Result a -> Bool $c== :: forall a. Eq a => Result a -> Result a -> Bool Eq, a -> Result b -> Result a (a -> b) -> Result a -> Result b (forall a b. (a -> b) -> Result a -> Result b) -> (forall a b. a -> Result b -> Result a) -> Functor Result forall a b. a -> Result b -> Result a forall a b. (a -> b) -> Result a -> Result b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f <$ :: a -> Result b -> Result a $c<$ :: forall a b. a -> Result b -> Result a fmap :: (a -> b) -> Result a -> Result b $cfmap :: forall a b. (a -> b) -> Result a -> Result b Functor, (forall x. Result a -> Rep (Result a) x) -> (forall x. Rep (Result a) x -> Result a) -> Generic (Result a) forall x. Rep (Result a) x -> Result a forall x. Result a -> Rep (Result a) x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a forall a x. Rep (Result a) x -> Result a forall a x. Result a -> Rep (Result a) x $cto :: forall a x. Rep (Result a) x -> Result a $cfrom :: forall a x. Result a -> Rep (Result a) x Generic) instance NFData a => NFData (Result a) instance Applicative Result where pure :: a -> Result a pure = a -> Result a forall a. a -> Result a Success Success a -> b f <*> :: Result (a -> b) -> Result a -> Result b <*> Result a x = (a -> b) -> Result a -> Result b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> b f Result a x Failure String msg <*> Result a _ = String -> Result b forall a. String -> Result a Failure String msg instance Monad Result where return :: a -> Result a return = a -> Result a forall (f :: * -> *) a. Applicative f => a -> f a pure Success a x >>= :: Result a -> (a -> Result b) -> Result b >>= a -> Result b f = a -> Result b f a x Failure String msg >>= a -> Result b _ = String -> Result b forall a. String -> Result a Failure String msg instance MonadFail Result where fail :: String -> Result a fail = String -> Result a forall a. String -> Result a Failure