module Control.Joint.Abilities.Adaptable where

import "transformers" Control.Monad.Trans.Class (MonadTrans (lift))

import Control.Joint.Core (type (~>))
import Control.Joint.Abilities.Interpreted (Interpreted (run))
import Control.Joint.Abilities.Transformer (Transformer (build), Schema, (:>) (T, trans))

class Adaptable (eff :: * -> *) (schema :: * -> *) where
	{-# MINIMAL adapt #-}
	adapt :: eff ~> schema

type Embedding t u = (Transformer t, Monad u)
type Building t u = (Transformer t, Applicative u)

instance Adaptable t t where
	adapt :: t a -> t a
adapt = t a -> t a
forall a. a -> a
id

instance (Monad u, MonadTrans ((:>) t)) => Adaptable u (t :> u) where
	adapt :: u a -> (:>) t u a
adapt = u a -> (:>) t u a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance Building t u => Adaptable t (t :> u) where
	adapt :: t a -> (:>) t u a
adapt = t a -> (:>) t u a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u v)
	, MonadTrans ((:>) t)
	, Building u v
	) => Adaptable u (t :> u :> v) where
	adapt :: u a -> (:>) t (u :> v) a
adapt = (:>) u v a -> (:>) t (u :> v) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u v a -> (:>) t (u :> v) a)
-> (u a -> (:>) u v a) -> u a -> (:>) t (u :> v) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. u a -> (:>) u v a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u v)
	, Embedding u v
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	) => Adaptable v (t :> u :> v) where
	adapt :: v a -> (:>) t (u :> v) a
adapt = (:>) u v a -> (:>) t (u :> v) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u v a -> (:>) t (u :> v) a)
-> (v a -> (:>) u v a) -> v a -> (:>) t (u :> v) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> (:>) u v a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance
	( Embedding t (Schema u (v :> w))
	, Embedding u (Schema v w)
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, Building v w
	) => Adaptable v (t :> u :> v :> w) where
	adapt :: v a -> (:>) t (u :> (v :> w)) a
adapt = (:>) u (v :> w) a -> (:>) t (u :> (v :> w)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> w) a -> (:>) t (u :> (v :> w)) a)
-> (v a -> (:>) u (v :> w) a) -> v a -> (:>) t (u :> (v :> w)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v w a -> (:>) u (v :> w) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v w a -> (:>) u (v :> w) a)
-> (v a -> (:>) v w a) -> v a -> (:>) u (v :> w) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v a -> (:>) v w a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u v)
	, Embedding t (Schema u (v :> w))
	, Embedding u (Schema v w)
	, Embedding v w
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	) => Adaptable w (t :> u :> v :> w) where
	adapt :: w a -> (:>) t (u :> (v :> w)) a
adapt = (:>) u (v :> w) a -> (:>) t (u :> (v :> w)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> w) a -> (:>) t (u :> (v :> w)) a)
-> (w a -> (:>) u (v :> w) a) -> w a -> (:>) t (u :> (v :> w)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v w a -> (:>) u (v :> w) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v w a -> (:>) u (v :> w) a)
-> (w a -> (:>) v w a) -> w a -> (:>) u (v :> w) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. w a -> (:>) v w a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance (Embedding t (Schema u (v :> w :> x))
	, Embedding u (Schema v (w :> x))
	, Embedding v (Schema w x)
	, Embedding w x
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	) => Adaptable x (t :> u :> v :> w :> x) where
	adapt :: x a -> (:>) t (u :> (v :> (w :> x))) a
adapt = (:>) u (v :> (w :> x)) a -> (:>) t (u :> (v :> (w :> x))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> x)) a -> (:>) t (u :> (v :> (w :> x))) a)
-> (x a -> (:>) u (v :> (w :> x)) a)
-> x a
-> (:>) t (u :> (v :> (w :> x))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> x) a -> (:>) u (v :> (w :> x)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> x) a -> (:>) u (v :> (w :> x)) a)
-> (x a -> (:>) v (w :> x) a) -> x a -> (:>) u (v :> (w :> x)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w x a -> (:>) v (w :> x) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w x a -> (:>) v (w :> x) a)
-> (x a -> (:>) w x a) -> x a -> (:>) v (w :> x) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x a -> (:>) w x a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance (Embedding t (Schema u (v :> w :> x))
	, Embedding u (Schema v (w :> x))
	, Embedding v (Schema w x)
	, Building w x
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	) => Adaptable w (t :> u :> v :> w :> x) where
	adapt :: w a -> (:>) t (u :> (v :> (w :> x))) a
adapt = (:>) u (v :> (w :> x)) a -> (:>) t (u :> (v :> (w :> x))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> x)) a -> (:>) t (u :> (v :> (w :> x))) a)
-> (w a -> (:>) u (v :> (w :> x)) a)
-> w a
-> (:>) t (u :> (v :> (w :> x))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> x) a -> (:>) u (v :> (w :> x)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> x) a -> (:>) u (v :> (w :> x)) a)
-> (w a -> (:>) v (w :> x) a) -> w a -> (:>) u (v :> (w :> x)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w x a -> (:>) v (w :> x) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w x a -> (:>) v (w :> x) a)
-> (w a -> (:>) w x a) -> w a -> (:>) v (w :> x) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. w a -> (:>) w x a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u (v :> w :> x :> y))
	, Embedding u (Schema v (w :> x :> y))
	, Embedding v (Schema w (x :> y))
	, Embedding w (Schema x y)
	, Embedding x y
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	) => Adaptable y (t :> u :> v :> w :> x :> y) where
	adapt :: y a -> (:>) t (u :> (v :> (w :> (x :> y)))) a
adapt = (:>) u (v :> (w :> (x :> y))) a
-> (:>) t (u :> (v :> (w :> (x :> y)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> y))) a
 -> (:>) t (u :> (v :> (w :> (x :> y)))) a)
-> (y a -> (:>) u (v :> (w :> (x :> y))) a)
-> y a
-> (:>) t (u :> (v :> (w :> (x :> y)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> y)) a -> (:>) u (v :> (w :> (x :> y))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> y)) a -> (:>) u (v :> (w :> (x :> y))) a)
-> (y a -> (:>) v (w :> (x :> y)) a)
-> y a
-> (:>) u (v :> (w :> (x :> y))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> y) a -> (:>) v (w :> (x :> y)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> y) a -> (:>) v (w :> (x :> y)) a)
-> (y a -> (:>) w (x :> y) a) -> y a -> (:>) v (w :> (x :> y)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x y a -> (:>) w (x :> y) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x y a -> (:>) w (x :> y) a)
-> (y a -> (:>) x y a) -> y a -> (:>) w (x :> y) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. y a -> (:>) x y a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance
	( Embedding t (Schema u (v :> w :> x :> y))
	, Embedding u (Schema v (w :> x :> y))
	, Embedding v (Schema w (x :> y))
	, Embedding w (Schema x y)
	, Building x y
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	) => Adaptable x (t :> u :> v :> w :> x :> y) where
	adapt :: x a -> (:>) t (u :> (v :> (w :> (x :> y)))) a
adapt = (:>) u (v :> (w :> (x :> y))) a
-> (:>) t (u :> (v :> (w :> (x :> y)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> y))) a
 -> (:>) t (u :> (v :> (w :> (x :> y)))) a)
-> (x a -> (:>) u (v :> (w :> (x :> y))) a)
-> x a
-> (:>) t (u :> (v :> (w :> (x :> y)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> y)) a -> (:>) u (v :> (w :> (x :> y))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> y)) a -> (:>) u (v :> (w :> (x :> y))) a)
-> (x a -> (:>) v (w :> (x :> y)) a)
-> x a
-> (:>) u (v :> (w :> (x :> y))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> y) a -> (:>) v (w :> (x :> y)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> y) a -> (:>) v (w :> (x :> y)) a)
-> (x a -> (:>) w (x :> y) a) -> x a -> (:>) v (w :> (x :> y)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x y a -> (:>) w (x :> y) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x y a -> (:>) w (x :> y) a)
-> (x a -> (:>) x y a) -> x a -> (:>) w (x :> y) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. x a -> (:>) x y a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u (v :> w :> x :> y :> z))
	, Embedding u (Schema v (w :> x :> y :> z))
	, Embedding v (Schema w (x :> y :> z))
	, Embedding w (Schema x (y :> z))
	, Embedding x (Schema y z)
	, Embedding y z
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	, MonadTrans ((:>) y)
	) => Adaptable z (t :> u :> v :> w :> x :> y :> z) where
	adapt :: z a -> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a
adapt = (:>) u (v :> (w :> (x :> (y :> z)))) a
-> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> (y :> z)))) a
 -> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a)
-> (z a -> (:>) u (v :> (w :> (x :> (y :> z)))) a)
-> z a
-> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> (y :> z))) a
-> (:>) u (v :> (w :> (x :> (y :> z)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> (y :> z))) a
 -> (:>) u (v :> (w :> (x :> (y :> z)))) a)
-> (z a -> (:>) v (w :> (x :> (y :> z))) a)
-> z a
-> (:>) u (v :> (w :> (x :> (y :> z)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> (y :> z)) a -> (:>) v (w :> (x :> (y :> z))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> (y :> z)) a -> (:>) v (w :> (x :> (y :> z))) a)
-> (z a -> (:>) w (x :> (y :> z)) a)
-> z a
-> (:>) v (w :> (x :> (y :> z))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x (y :> z) a -> (:>) w (x :> (y :> z)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x (y :> z) a -> (:>) w (x :> (y :> z)) a)
-> (z a -> (:>) x (y :> z) a) -> z a -> (:>) w (x :> (y :> z)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) y z a -> (:>) x (y :> z) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) y z a -> (:>) x (y :> z) a)
-> (z a -> (:>) y z a) -> z a -> (:>) x (y :> z) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. z a -> (:>) y z a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance
	( Embedding t (Schema u (v :> w :> x :> y :> z))
	, Embedding u (Schema v (w :> x :> y :> z))
	, Embedding v (Schema w (x :> y :> z))
	, Embedding w (Schema x (y :> z))
	, Embedding x (Schema y z)
	, Building y z
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	) => Adaptable y (t :> u :> v :> w :> x :> y :> z) where
	adapt :: y a -> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a
adapt = (:>) u (v :> (w :> (x :> (y :> z)))) a
-> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> (y :> z)))) a
 -> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a)
-> (y a -> (:>) u (v :> (w :> (x :> (y :> z)))) a)
-> y a
-> (:>) t (u :> (v :> (w :> (x :> (y :> z))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> (y :> z))) a
-> (:>) u (v :> (w :> (x :> (y :> z)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> (y :> z))) a
 -> (:>) u (v :> (w :> (x :> (y :> z)))) a)
-> (y a -> (:>) v (w :> (x :> (y :> z))) a)
-> y a
-> (:>) u (v :> (w :> (x :> (y :> z)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> (y :> z)) a -> (:>) v (w :> (x :> (y :> z))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> (y :> z)) a -> (:>) v (w :> (x :> (y :> z))) a)
-> (y a -> (:>) w (x :> (y :> z)) a)
-> y a
-> (:>) v (w :> (x :> (y :> z))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x (y :> z) a -> (:>) w (x :> (y :> z)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x (y :> z) a -> (:>) w (x :> (y :> z)) a)
-> (y a -> (:>) x (y :> z) a) -> y a -> (:>) w (x :> (y :> z)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) y z a -> (:>) x (y :> z) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) y z a -> (:>) x (y :> z) a)
-> (y a -> (:>) y z a) -> y a -> (:>) x (y :> z) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. y a -> (:>) y z a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u (v :> w :> x :> y :> z :> f))
	, Embedding u (Schema v (w :> x :> y :> z :> f))
	, Embedding v (Schema w (x :> y :> z :> f))
	, Embedding w (Schema x (y :> z :> f))
	, Embedding x (Schema y (z :> f))
	, Embedding y (Schema z f)
	, Embedding z f
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	, MonadTrans ((:>) y)
	, MonadTrans ((:>) z)
	) => Adaptable f (t :> u :> v :> w :> x :> y :> z :> f) where
	adapt :: f a -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a
adapt = (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
 -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a)
-> (f a -> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a)
-> f a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> (y :> (z :> f)))) a
-> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> (y :> (z :> f)))) a
 -> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a)
-> (f a -> (:>) v (w :> (x :> (y :> (z :> f)))) a)
-> f a
-> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> (y :> (z :> f))) a
-> (:>) v (w :> (x :> (y :> (z :> f)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> (y :> (z :> f))) a
 -> (:>) v (w :> (x :> (y :> (z :> f)))) a)
-> (f a -> (:>) w (x :> (y :> (z :> f))) a)
-> f a
-> (:>) v (w :> (x :> (y :> (z :> f)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x (y :> (z :> f)) a -> (:>) w (x :> (y :> (z :> f))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x (y :> (z :> f)) a -> (:>) w (x :> (y :> (z :> f))) a)
-> (f a -> (:>) x (y :> (z :> f)) a)
-> f a
-> (:>) w (x :> (y :> (z :> f))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) y (z :> f) a -> (:>) x (y :> (z :> f)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) y (z :> f) a -> (:>) x (y :> (z :> f)) a)
-> (f a -> (:>) y (z :> f) a) -> f a -> (:>) x (y :> (z :> f)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) z f a -> (:>) y (z :> f) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) z f a -> (:>) y (z :> f) a)
-> (f a -> (:>) z f a) -> f a -> (:>) y (z :> f) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> (:>) z f a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance
	( Embedding t (Schema u (v :> w :> x :> y :> z :> f))
	, Embedding u (Schema v (w :> x :> y :> z :> f))
	, Embedding v (Schema w (x :> y :> z :> f))
	, Embedding w (Schema x (y :> z :> f))
	, Embedding x (Schema y (z :> f))
	, Embedding y (Schema z f)
	, Building z f
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	, MonadTrans ((:>) y)
	, MonadTrans ((:>) z)
	) => Adaptable z (t :> u :> v :> w :> x :> y :> z :> f) where
	adapt :: z a -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a
adapt = (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
 -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a)
-> (z a -> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a)
-> z a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> f)))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> (y :> (z :> f)))) a
-> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> (y :> (z :> f)))) a
 -> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a)
-> (z a -> (:>) v (w :> (x :> (y :> (z :> f)))) a)
-> z a
-> (:>) u (v :> (w :> (x :> (y :> (z :> f))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> (y :> (z :> f))) a
-> (:>) v (w :> (x :> (y :> (z :> f)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> (y :> (z :> f))) a
 -> (:>) v (w :> (x :> (y :> (z :> f)))) a)
-> (z a -> (:>) w (x :> (y :> (z :> f))) a)
-> z a
-> (:>) v (w :> (x :> (y :> (z :> f)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x (y :> (z :> f)) a -> (:>) w (x :> (y :> (z :> f))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x (y :> (z :> f)) a -> (:>) w (x :> (y :> (z :> f))) a)
-> (z a -> (:>) x (y :> (z :> f)) a)
-> z a
-> (:>) w (x :> (y :> (z :> f))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) y (z :> f) a -> (:>) x (y :> (z :> f)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) y (z :> f) a -> (:>) x (y :> (z :> f)) a)
-> (z a -> (:>) y (z :> f) a) -> z a -> (:>) x (y :> (z :> f)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) z f a -> (:>) y (z :> f) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) z f a -> (:>) y (z :> f) a)
-> (z a -> (:>) z f a) -> z a -> (:>) y (z :> f) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. z a -> (:>) z f a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build

instance
	( Embedding t (Schema u (v :> w :> x :> y :> z :> f :> h))
	, Embedding u (Schema v (w :> x :> y :> z :> f :> h))
	, Embedding v (Schema w (x :> y :> z :> f :> h))
	, Embedding w (Schema x (y :> z :> f :> h))
	, Embedding x (Schema y (z :> f :> h))
	, Embedding y (Schema z (f :> h))
	, Embedding z (Schema f h)
	, Embedding f h
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	, MonadTrans ((:>) y)
	, MonadTrans ((:>) z)
	, MonadTrans ((:>) f)
	) => Adaptable h (t :> u :> v :> w :> x :> y :> z :> f :> h) where
	adapt :: h a -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a
adapt = (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
 -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a)
-> (h a -> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a)
-> h a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
-> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
 -> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a)
-> (h a -> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a)
-> h a
-> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> (y :> (z :> (f :> h)))) a
-> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> (y :> (z :> (f :> h)))) a
 -> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a)
-> (h a -> (:>) w (x :> (y :> (z :> (f :> h)))) a)
-> h a
-> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x (y :> (z :> (f :> h))) a
-> (:>) w (x :> (y :> (z :> (f :> h)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x (y :> (z :> (f :> h))) a
 -> (:>) w (x :> (y :> (z :> (f :> h)))) a)
-> (h a -> (:>) x (y :> (z :> (f :> h))) a)
-> h a
-> (:>) w (x :> (y :> (z :> (f :> h)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) y (z :> (f :> h)) a -> (:>) x (y :> (z :> (f :> h))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) y (z :> (f :> h)) a -> (:>) x (y :> (z :> (f :> h))) a)
-> (h a -> (:>) y (z :> (f :> h)) a)
-> h a
-> (:>) x (y :> (z :> (f :> h))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) z (f :> h) a -> (:>) y (z :> (f :> h)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) z (f :> h) a -> (:>) y (z :> (f :> h)) a)
-> (h a -> (:>) z (f :> h) a) -> h a -> (:>) y (z :> (f :> h)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) f h a -> (:>) z (f :> h) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) f h a -> (:>) z (f :> h) a)
-> (h a -> (:>) f h a) -> h a -> (:>) z (f :> h) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. h a -> (:>) f h a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance
	( Embedding t (Schema u (v :> w :> x :> y :> z :> f :> h))
	, Embedding u (Schema v (w :> x :> y :> z :> f :> h))
	, Embedding v (Schema w (x :> y :> z :> f :> h))
	, Embedding w (Schema x (y :> z :> f :> h))
	, Embedding x (Schema y (z :> f :> h))
	, Embedding y (Schema z (f :> h))
	, Embedding z (Schema f h)
	, Building f h
	, MonadTrans ((:>) t)
	, MonadTrans ((:>) u)
	, MonadTrans ((:>) v)
	, MonadTrans ((:>) w)
	, MonadTrans ((:>) x)
	, MonadTrans ((:>) y)
	, MonadTrans ((:>) z)
	) => Adaptable f (t :> u :> v :> w :> x :> y :> z :> f :> h) where
	adapt :: f a -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a
adapt = (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
 -> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a)
-> (f a -> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a)
-> f a
-> (:>) t (u :> (v :> (w :> (x :> (y :> (z :> (f :> h))))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
-> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
 -> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a)
-> (f a -> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a)
-> f a
-> (:>) u (v :> (w :> (x :> (y :> (z :> (f :> h)))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) w (x :> (y :> (z :> (f :> h)))) a
-> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) w (x :> (y :> (z :> (f :> h)))) a
 -> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a)
-> (f a -> (:>) w (x :> (y :> (z :> (f :> h)))) a)
-> f a
-> (:>) v (w :> (x :> (y :> (z :> (f :> h))))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) x (y :> (z :> (f :> h))) a
-> (:>) w (x :> (y :> (z :> (f :> h)))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) x (y :> (z :> (f :> h))) a
 -> (:>) w (x :> (y :> (z :> (f :> h)))) a)
-> (f a -> (:>) x (y :> (z :> (f :> h))) a)
-> f a
-> (:>) w (x :> (y :> (z :> (f :> h)))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) y (z :> (f :> h)) a -> (:>) x (y :> (z :> (f :> h))) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) y (z :> (f :> h)) a -> (:>) x (y :> (z :> (f :> h))) a)
-> (f a -> (:>) y (z :> (f :> h)) a)
-> f a
-> (:>) x (y :> (z :> (f :> h))) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) z (f :> h) a -> (:>) y (z :> (f :> h)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) z (f :> h) a -> (:>) y (z :> (f :> h)) a)
-> (f a -> (:>) z (f :> h) a) -> f a -> (:>) y (z :> (f :> h)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:>) f h a -> (:>) z (f :> h) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ((:>) f h a -> (:>) z (f :> h) a)
-> (f a -> (:>) f h a) -> f a -> (:>) z (f :> h) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> (:>) f h a
forall (t :: * -> *) (u :: * -> *).
(Transformer t, Applicative u) =>
t ~> (t :> u)
build