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