{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE StandaloneKindSignatures #-}
module Control.Category.Dual where

import Prelude hiding (id, (.))
import Control.Category
import Data.Kind (Type)

type Dual :: forall k. (k -> k -> Type) -> k -> k -> Type
newtype Dual cat a b = Dual { forall k (cat :: k -> k -> *) (a :: k) (b :: k).
Dual cat a b -> cat b a
getDual :: cat b a }

instance Category cat => Category (Dual cat) where
    id :: forall (a :: k). Dual cat a a
id = cat a a -> Dual cat a a
forall k (cat :: k -> k -> *) (a :: k) (b :: k).
cat b a -> Dual cat a b
Dual cat a a
forall (a :: k). cat a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
    Dual cat c b
cb . :: forall (b :: k) (c :: k) (a :: k).
Dual cat b c -> Dual cat a b -> Dual cat a c
. Dual cat b a
ba = cat c a -> Dual cat a c
forall k (cat :: k -> k -> *) (a :: k) (b :: k).
cat b a -> Dual cat a b
Dual (cat b a
ba cat b a -> cat c b -> cat c a
forall (b :: k) (c :: k) (a :: k). cat b c -> cat a b -> cat a c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. cat c b
cb)