{-# OPTIONS_GHC -cpp #-}
-------------------------------------------------------------------------------------------
-- |
-- Module : Control.Dyad
-- Copyright : 2008 Edward Kmett
-- License : BSD3
--
-- Maintainer : Edward Kmett <ekmett@gmail.com>
-- Stability : experimental
-- Portability : portable
--
-- Working Towards Maarten Fokkinga's Dyads
-------------------------------------------------------------------------------------------
module Control.Dyad where
import Prelude hiding (id,(.))
import Control.Category
import Control.Functor.Categorical
class (CDistributes w m (~>), CDistributes m w (~>), CExtend w (~>), CBind m (~>)) => CDyad w m (~>) where
cdyid :: w a ~> m a
newtype DiKleisli w m (~>) a b = DiKleisli { runDiKleisli :: w a ~> m b }
-- instance CMonad m k => CFunctor (DiKleisli w m k a) k k where
-- cmap f (DiKleisli x) = DiKleisli (cmap f . x)
-- instance CMonad m k => QFunctor (DiKleisli w m k) k k where second g =
-- instance CComonad w k => PFunctor (DiKleisli w m k) (Dual k) k where first f =
-- instance (CMonad m k, CComonad w k) => Bifunctor (DiKleisli w m k) (Dual Hask) Hask Hask where bimap f g
instance CDyad w m k => Category (DiKleisli w m k) where
DiKleisli f . DiKleisli g = DiKleisli (cbind f . cdist . cextend g)
id = DiKleisli cdyid