module Control.Joint.Effects.Either where import Control.Joint.Operators ((<$$>), (<**>)) import Control.Joint.Abilities.Interpreted (Interpreted (Primary, run)) import Control.Joint.Abilities.Transformer (Transformer (build, unite), Schema, (:>) (T)) import Control.Joint.Abilities.Adaptable (Adaptable (adapt)) import Control.Joint.Schemes (UT (UT), type (<.:>)) instance Interpreted (Either e) where type Primary (Either e) a = Either e a run :: Either e a -> Primary (Either e) a run Either e a x = Either e a Primary (Either e) a x type instance Schema (Either e) = UT (Either e) instance Transformer (Either e) where build :: Either e ~> (Either e :> u) build Either e a x = UT (Either e) u a -> (:>) (Either e) u a forall (t :: * -> *) (u :: * -> *) a. (Transformer t => Schema t u a) -> (:>) t u a T (UT (Either e) u a -> (:>) (Either e) u a) -> (Either e a -> UT (Either e) u a) -> Either e a -> (:>) (Either e) u a forall b c a. (b -> c) -> (a -> b) -> a -> c . ((u :. Either e) := a) -> UT (Either e) u a forall k k (t :: k -> k) (u :: k -> *) (a :: k). ((u :. t) := a) -> UT t u a UT (((u :. Either e) := a) -> UT (Either e) u a) -> (Either e a -> (u :. Either e) := a) -> Either e a -> UT (Either e) u a forall b c a. (b -> c) -> (a -> b) -> a -> c . Either e a -> (u :. Either e) := a forall (f :: * -> *) a. Applicative f => a -> f a pure (Either e a -> (:>) (Either e) u a) -> Either e a -> (:>) (Either e) u a forall a b. (a -> b) -> a -> b $ Either e a x unite :: Primary (Schema (Either e) u) a -> (:>) (Either e) u a unite = UT (Either e) u a -> (:>) (Either e) u a forall (t :: * -> *) (u :: * -> *) a. (Transformer t => Schema t u a) -> (:>) t u a T (UT (Either e) u a -> (:>) (Either e) u a) -> (((u :. Either e) := a) -> UT (Either e) u a) -> ((u :. Either e) := a) -> (:>) (Either e) u a forall b c a. (b -> c) -> (a -> b) -> a -> c . ((u :. Either e) := a) -> UT (Either e) u a forall k k (t :: k -> k) (u :: k -> *) (a :: k). ((u :. t) := a) -> UT t u a UT instance Functor u => Functor (Either e <.:> u) where fmap :: (a -> b) -> (<.:>) (Either e) u a -> (<.:>) (Either e) u b fmap a -> b f (UT (u :. Either e) := a x) = ((u :. Either e) := b) -> (<.:>) (Either e) u b forall k k (t :: k -> k) (u :: k -> *) (a :: k). ((u :. t) := a) -> UT t u a UT (((u :. Either e) := b) -> (<.:>) (Either e) u b) -> ((u :. Either e) := b) -> (<.:>) (Either e) u b forall a b. (a -> b) -> a -> b $ a -> b f (a -> b) -> ((u :. Either e) := a) -> (u :. Either e) := b forall (t :: * -> *) (u :: * -> *) a b. (Functor t, Functor u) => (a -> b) -> ((t :. u) := a) -> (t :. u) := b <$$> (u :. Either e) := a x instance Applicative u => Applicative (Either e <.:> u) where pure :: a -> (<.:>) (Either e) u a pure = ((u :. Either e) := a) -> (<.:>) (Either e) u a forall k k (t :: k -> k) (u :: k -> *) (a :: k). ((u :. t) := a) -> UT t u a UT (((u :. Either e) := a) -> (<.:>) (Either e) u a) -> (a -> (u :. Either e) := a) -> a -> (<.:>) (Either e) u a forall b c a. (b -> c) -> (a -> b) -> a -> c . Either e a -> (u :. Either e) := a forall (f :: * -> *) a. Applicative f => a -> f a pure (Either e a -> (u :. Either e) := a) -> (a -> Either e a) -> a -> (u :. Either e) := a forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> Either e a forall (f :: * -> *) a. Applicative f => a -> f a pure UT (u :. Either e) := (a -> b) f <*> :: (<.:>) (Either e) u (a -> b) -> (<.:>) (Either e) u a -> (<.:>) (Either e) u b <*> UT (u :. Either e) := a x = ((u :. Either e) := b) -> (<.:>) (Either e) u b forall k k (t :: k -> k) (u :: k -> *) (a :: k). ((u :. t) := a) -> UT t u a UT (((u :. Either e) := b) -> (<.:>) (Either e) u b) -> ((u :. Either e) := b) -> (<.:>) (Either e) u b forall a b. (a -> b) -> a -> b $ (u :. Either e) := (a -> b) f ((u :. Either e) := (a -> b)) -> ((u :. Either e) := a) -> (u :. Either e) := b forall (t :: * -> *) (u :: * -> *) a b. (Applicative t, Applicative u) => ((t :. u) := (a -> b)) -> ((t :. u) := a) -> (t :. u) := b <**> (u :. Either e) := a x instance (Applicative u, Monad u) => Monad (Either e <.:> u) where UT (u :. Either e) := a x >>= :: (<.:>) (Either e) u a -> (a -> (<.:>) (Either e) u b) -> (<.:>) (Either e) u b >>= a -> (<.:>) (Either e) u b f = ((u :. Either e) := b) -> (<.:>) (Either e) u b forall k k (t :: k -> k) (u :: k -> *) (a :: k). ((u :. t) := a) -> UT t u a UT (((u :. Either e) := b) -> (<.:>) (Either e) u b) -> ((u :. Either e) := b) -> (<.:>) (Either e) u b forall a b. (a -> b) -> a -> b $ (u :. Either e) := a x ((u :. Either e) := a) -> (Either e a -> (u :. Either e) := b) -> (u :. Either e) := b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= (e -> (u :. Either e) := b) -> (a -> (u :. Either e) := b) -> Either e a -> (u :. Either e) := b forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either (Either e b -> (u :. Either e) := b forall (f :: * -> *) a. Applicative f => a -> f a pure (Either e b -> (u :. Either e) := b) -> (e -> Either e b) -> e -> (u :. Either e) := b forall b c a. (b -> c) -> (a -> b) -> a -> c . e -> Either e b forall a b. a -> Either a b Left) ((<.:>) (Either e) u b -> (u :. Either e) := b forall (t :: * -> *) a. Interpreted t => t a -> Primary t a run ((<.:>) (Either e) u b -> (u :. Either e) := b) -> (a -> (<.:>) (Either e) u b) -> a -> (u :. Either e) := b forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> (<.:>) (Either e) u b f) type Failable e = Adaptable (Either e) failure :: Failable e t => e -> t a failure :: e -> t a failure = Either e a -> t a forall (eff :: * -> *) (schema :: * -> *). Adaptable eff schema => eff ~> schema adapt (Either e a -> t a) -> (e -> Either e a) -> e -> t a forall b c a. (b -> c) -> (a -> b) -> a -> c . e -> Either e a forall a b. a -> Either a b Left