{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE TypeFamilies #-}
module Free.Agent.Syntax
( FreeAgent (..),
)
where
import Circuit.Category (Category (..))
import Prelude hiding (id, (.))
data FreeAgent arr a b where
Lift :: arr a b -> FreeAgent arr a b
Compose :: FreeAgent arr b c -> FreeAgent arr a b -> FreeAgent arr a c
instance (Category arr) => Category (FreeAgent arr) where
id :: forall (a :: k). FreeAgent arr a a
id = arr a a -> FreeAgent arr a a
forall {k} (arr :: k -> k -> *) (a :: k) (b :: k).
arr a b -> FreeAgent arr a b
Lift arr a a
forall (a :: k). arr a a
forall k (arr :: k -> k -> *) (a :: k). Category arr => arr a a
id
. :: forall (b :: k) (c :: k) (a :: k).
FreeAgent arr b c -> FreeAgent arr a b -> FreeAgent arr a c
(.) = FreeAgent arr b c -> FreeAgent arr a b -> FreeAgent arr a c
forall {k} (arr :: k -> k -> *) (b :: k) (c :: k) (a :: k).
FreeAgent arr b c -> FreeAgent arr a b -> FreeAgent arr a c
Compose