packages feed

joint-0.1.4: Control/Joint/Abilities/Liftable.hs

module Control.Joint.Abilities.Liftable where

import Control.Joint.Abilities.Transformer (Transformer (Schema, build, embed), (:>) (T))

class Liftable (eff :: * -> *) (schema :: * -> *) where
	lift :: eff a -> schema a

instance (Functor u, Transformer t) => Liftable u (t :> u) where
	lift = T . embed

instance (Applicative u, Transformer t) => Liftable t (t :> u) where
	lift = T . build

instance (Functor (Schema u v), Applicative v, Transformer u, Transformer t)
	=> Liftable u (t :> u :> v) where
	lift = T . embed . T . build

instance (Functor (Schema u v), Functor v, Transformer u, Transformer t)
	=> Liftable v (t :> u :> v) where
	lift = T . embed . T . embed

instance (Functor (Schema u v), Functor (Schema v w), Functor (Schema u (v :> w))
	, Applicative v, Applicative w, Transformer u, Transformer t, Transformer v)
		=> Liftable v (t :> u :> v :> w) where
	lift = T . embed . T . embed . T . build

instance (Functor (Schema u v), Functor (Schema v w), Functor (Schema u (v :> w))
	, Applicative v, Functor w, Transformer t, Transformer u, Transformer v)
		=> Liftable w (t :> u :> v :> w) where
	lift = T . embed . T . embed . T . embed

instance (Functor (Schema u (v :> w :> x)), Functor (Schema v (w :> x)), Functor (Schema w x)
	, Functor x, Transformer t, Transformer u, Transformer v, Transformer w)
		=> Liftable x (t :> u :> v :> w :> x) where
	lift = T . embed . T . embed . T . embed . T . embed

instance (Functor (Schema u (v :> w :> x)), Functor (Schema v (w :> x)), Functor (Schema w x)
	, Applicative x, Transformer t, Transformer u, Transformer v, Transformer w)
		=> Liftable w (t :> u :> v :> w :> x) where
	lift = T . embed . T . embed . T . embed . T . build

instance (Functor (Schema u (v :> w :> x)), Functor (Schema v (w :> x)), Functor (Schema w x), Functor (Schema x y)
	, Functor (Schema w (x :> y)), Functor (Schema v (w :> x :> y)), Functor (Schema u (v :> w :> x :> y))
		, Functor y, Transformer t, Transformer u, Transformer v, Transformer w, Transformer x)
			=> Liftable y (t :> u :> v :> w :> x :> y) where
	lift = T . embed . T . embed . T . embed . T . embed . T . embed

instance (Functor (Schema u (v :> w :> x)), Functor (Schema v (w :> x)), Functor (Schema w x)
	, Functor (Schema x y), Functor (Schema w (x :> y)), Functor (Schema v (w :> x :> y))
		, Functor (Schema u (v :> w :> x :> y)), Functor y
		, Applicative y, Transformer t, Transformer u, Transformer v, Transformer w, Transformer x)
			=> Liftable x (t :> u :> v :> w :> x :> y) where
	lift = T . embed . T . embed . T . embed . T . embed . T . build

instance (Functor (Schema u (v :> w :> x :> y :> z)), Functor (Schema v (w :> x :> y :> z))
	, Functor (Schema w (x :> y :> z)), Functor (Schema x (y :> z)), Functor (Schema y z)
		, Functor z, Transformer t, Transformer u, Transformer v
			, Transformer w, Transformer x, Transformer z, Transformer y)
				=> Liftable z (t :> u :> v :> w :> x :> y :> z) where
	lift = T . embed . T . embed . T . embed . T . embed . T . embed . T . embed

instance (Functor (Schema u (v :> w :> x :> y :> z)), Functor (Schema v (w :> x :> y :> z))
	, Functor (Schema w (x :> y :> z)), Functor (Schema x (y :> z)), Functor (Schema y z)
		, Applicative z, Transformer t, Transformer u, Transformer v
			, Transformer w, Transformer x, Transformer z, Transformer y)
				=> Liftable y (t :> u :> v :> w :> x :> y :> z) where
	lift = T . embed . T . embed . T . embed . T . embed . T . embed . T . build