module Fallible where

import Control.Monad.Fail (MonadFail (fail))
import Prelude hiding (fail)

newtype Fallible a = Fallible (Either String a)
    deriving newtype (forall a b. a -> Fallible b -> Fallible a
forall a b. (a -> b) -> Fallible a -> Fallible b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Fallible b -> Fallible a
$c<$ :: forall a b. a -> Fallible b -> Fallible a
fmap :: forall a b. (a -> b) -> Fallible a -> Fallible b
$cfmap :: forall a b. (a -> b) -> Fallible a -> Fallible b
Functor, Functor Fallible
forall a. a -> Fallible a
forall a b. Fallible a -> Fallible b -> Fallible a
forall a b. Fallible a -> Fallible b -> Fallible b
forall a b. Fallible (a -> b) -> Fallible a -> Fallible b
forall a b c.
(a -> b -> c) -> Fallible a -> Fallible b -> Fallible c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. Fallible a -> Fallible b -> Fallible a
$c<* :: forall a b. Fallible a -> Fallible b -> Fallible a
*> :: forall a b. Fallible a -> Fallible b -> Fallible b
$c*> :: forall a b. Fallible a -> Fallible b -> Fallible b
liftA2 :: forall a b c.
(a -> b -> c) -> Fallible a -> Fallible b -> Fallible c
$cliftA2 :: forall a b c.
(a -> b -> c) -> Fallible a -> Fallible b -> Fallible c
<*> :: forall a b. Fallible (a -> b) -> Fallible a -> Fallible b
$c<*> :: forall a b. Fallible (a -> b) -> Fallible a -> Fallible b
pure :: forall a. a -> Fallible a
$cpure :: forall a. a -> Fallible a
Applicative, Applicative Fallible
forall a. a -> Fallible a
forall a b. Fallible a -> Fallible b -> Fallible b
forall a b. Fallible a -> (a -> Fallible b) -> Fallible b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> Fallible a
$creturn :: forall a. a -> Fallible a
>> :: forall a b. Fallible a -> Fallible b -> Fallible b
$c>> :: forall a b. Fallible a -> Fallible b -> Fallible b
>>= :: forall a b. Fallible a -> (a -> Fallible b) -> Fallible b
$c>>= :: forall a b. Fallible a -> (a -> Fallible b) -> Fallible b
Monad, Fallible a -> Fallible a -> Bool
forall a. Eq a => Fallible a -> Fallible a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Fallible a -> Fallible a -> Bool
$c/= :: forall a. Eq a => Fallible a -> Fallible a -> Bool
== :: Fallible a -> Fallible a -> Bool
$c== :: forall a. Eq a => Fallible a -> Fallible a -> Bool
Eq, Int -> Fallible a -> ShowS
[Fallible a] -> ShowS
Fallible a -> String
forall a. Show a => Int -> Fallible a -> ShowS
forall a. Show a => [Fallible a] -> ShowS
forall a. Show a => Fallible a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Fallible a] -> ShowS
$cshowList :: forall a. Show a => [Fallible a] -> ShowS
show :: Fallible a -> String
$cshow :: forall a. Show a => Fallible a -> String
showsPrec :: Int -> Fallible a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Fallible a -> ShowS
Show)

instance MonadFail Fallible where
    fail :: forall a. String -> Fallible a
fail = forall a. Either String a -> Fallible a
Fallible forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> Either a b
Left