module Data.Monoid.Categorical
( module Data.Monoid.Reducer
, module Control.Category
, GEndo(GEndo, getGEndo)
, CMonoid
, categoryToMonoid
, monoidToCategory
) where
import Prelude hiding ((.),id)
import Data.Monoid.Reducer
import Control.Category
data GEndo k a = GEndo { getGEndo :: k a a }
instance Category k => Monoid (GEndo k a) where
mempty = GEndo id
GEndo f `mappend` GEndo g = GEndo (f . g)
data CMonoid m n o where
M :: Monoid m => m -> CMonoid m a a
categoryToMonoid :: CMonoid m m m -> m
categoryToMonoid (M m) = m
monoidToCategory :: Monoid m => m -> CMonoid m m m
monoidToCategory = M
instance Monoid m => Category (CMonoid m) where
id = M mempty
M a . M b = M (a `mappend` b)
instance Monoid m => Monoid (CMonoid m m m) where
mempty = id
mappend = (.)
instance (c `Reducer` m) => Reducer c (CMonoid m m m) where
unit = M . unit
instance Monoid m => Reducer (CMonoid m m m) m where
unit (M m) = m