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