packages feed

pandora-0.2.1: Pandora/Paradigm/Controlflow/Joint/Transformer.hs

module Pandora.Paradigm.Controlflow.Joint.Transformer (Transformer (..), type (:>)) where

import Pandora.Core.Transformation (type (~>))
import Pandora.Paradigm.Controlflow.Joint.Interpreted (Interpreted)
import Pandora.Pattern.Functor.Covariant (Covariant)
import Pandora.Pattern.Functor.Pointable (Pointable)

class Interpreted t => Transformer t where
	{-# MINIMAL lay, wrap #-}
	type Schema (t :: * -> *) (u :: * -> *) = (r :: * -> *) | r -> t u
	lay :: Covariant u => u ~> Schema t u
	wrap :: Pointable u => t ~> Schema t u

-- infixr 1 :>
-- type (:>) t u a = Transformer t => Schema t u a

infixr 3 :>
newtype (:>) t u a = T { trans :: Transformer t => Schema t u a }