----------------------------------------------------------------------------- -- -- Module : Data.DualCategory.Instances.Categories.Kleisli -- Copyright : -- License : BSD3 -- -- Maintainer : -- Stability : -- Portability : -- -- | -- ----------------------------------------------------------------------------- {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-} module Data.DualCategory.Instances.Categories.Kleisli ( ) where import Control.Arrow (Kleisli(Kleisli)) import qualified Control.Arrow as A import Control.Categorical.Bifunctor (PFunctor, QFunctor, Bifunctor, first, second, bimap) import Control.Category.Associative (Associative, associate, disassociate) import Control.Category.Braided (Braided, braid, Symmetric, braid, swap) instance (Monad m) => PFunctor (,) (Kleisli m) (Kleisli m) where first = A.first instance (Monad m) => QFunctor (,) (Kleisli m) (Kleisli m) where second = A.second instance (Monad m) => Bifunctor (,) (Kleisli m) (Kleisli m) (Kleisli m) where bimap = (A.***) instance (Monad m, Bifunctor p (Kleisli m) (Kleisli m) (Kleisli m), Associative (->) p) => Associative (Kleisli m) p where associate = Kleisli (return . associate) disassociate = Kleisli (return . disassociate) instance (Monad m, Associative (Kleisli m) p, Braided (->) p) => Braided (Kleisli m) p where braid = Kleisli (return . braid) instance Braided (Kleisli m) p => Symmetric (Kleisli m) p