packages feed

pandora-0.4.6: Pandora/Paradigm/Controlflow/Effect/Interpreted.hs

module Pandora.Paradigm.Controlflow.Effect.Interpreted where

import Pandora.Core.Functor (type (:.), type (:=))
import Pandora.Pattern.Semigroupoid ((.))
import Pandora.Pattern.Functor.Covariant (Covariant ((-<$>-)), (-<$$>-), (-<$$$>-), (-<$$$$>-))
import Pandora.Pattern.Transformer.Liftable (Liftable (lift))
import Pandora.Paradigm.Primary.Algebraic.Exponential ()

infixr 2 ||=, =||

type family Schematic (c :: (* -> *) -> k) (t :: * -> *) = (r :: (* -> *) -> * -> *) | r -> t

class Interpreted t where
	{-# MINIMAL run, unite #-}
	type Primary t a :: *
	run :: t a -> Primary t a
	unite :: Primary t a -> t a

	(||=) :: Interpreted u => (Primary t a -> Primary u b) -> t a -> u b
	(||=) f = unite . f . run

	(=||) :: Interpreted u => (t a -> u b) -> Primary t a -> Primary u b
	(=||) f = run . f . unite

	(<$||=) :: (Covariant (->) (->) j, Interpreted u)
		=> (Primary t a -> Primary u b) -> j := t a -> j := u b
	f <$||= x = (f ||=) -<$>- x

	(<$$||=) :: (Covariant (->) (->) j, Covariant (->) (->) k, Interpreted u)
		=> (Primary t a -> Primary u b) -> j :. k := t a -> j :. k := u b
	f <$$||= x = (f ||=) -<$$>- x

	(<$$$||=) :: (Covariant (->) (->) j, Covariant (->) (->) k, Covariant (->) (->) l, Interpreted u)
		=> (Primary t a -> Primary u b) -> j :. k :. l := t a -> j :. k :. l := u b
	f <$$$||= x = (f ||=) -<$$$>- x

	(<$$$$||=) :: (Covariant (->) (->) j, Covariant (->) (->) k, Covariant (->) (->) l, Covariant (->) (->) m, Interpreted u)
		=> (Primary t a -> Primary u b) -> j :. k :. l :. m := t a -> j :. k :. l :. m := u b
	f <$$$$||= x = (f ||=) -<$$$$>- x

	(=||$>) :: (Covariant (->) (->) j, Interpreted u)
		=> (t a -> u b) -> j := Primary t a -> j := Primary u b
	f =||$> x = (f =||) -<$>- x

	(=||$$>) :: (Covariant (->) (->) j, Covariant (->) (->) k, Interpreted u)
		=> (t a -> u b) -> j :. k := Primary t a -> j :. k := Primary u b
	f =||$$> x = (f =||) -<$$>- x

	(=||$$$>) :: (Covariant (->) (->) j, Covariant (->) (->) k, Covariant (->) (->) l, Interpreted u)
		=> (t a -> u b) -> j :. k :. l := Primary t a -> j :. k :. l := Primary u b
	f =||$$$> x = (f =||) -<$$$>- x

	(=||$$$$>) :: (Covariant (->) (->) j, Covariant (->) (->) k, Covariant (->) (->) l, Covariant (->) (->) m, Interpreted u)
		=> (t a -> u b) -> j :. k :. l :. m := Primary t a -> j :. k :. l :. m := Primary u b
	f =||$$$$> x = (f =||) -<$$$$>- x

(-=:) :: (Liftable (->) t, Interpreted (t u), Interpreted (t v), Covariant (->) (->) u)
	=> (t u a -> t v b) -> u a -> Primary (t v) b
(-=:) f = run . f . lift