acme-kitchen-sink-0.1.0.0: src/Data/Monoid/Category.hs
{-# LANGUAGE FlexibleInstances #-}
{- |
Monoids on category composition.
Issue #3
-}
module Data.Monoid.Category where
import qualified Control.Category as Cat
import Data.Monoid.Acme
import Control.Applicative
-- | Monoid on category composition (>>>)
newtype Composition c = Composition {getComposition :: c}
instance Cat.Category c => Monoid (Composition (c a a)) where
mempty = Composition Cat.id
mappend (Composition a) (Composition b) = Composition $ a Cat.>>> b
-- | Monoid on reverse category composition (<<<)
newtype RevComposition c = RevComposition {getRevComposition :: c}
instance Cat.Category c => Monoid (RevComposition (c a a)) where
mempty = RevComposition Cat.id
mappend (RevComposition a) (RevComposition b) = RevComposition $ a Cat.<<< b
-- | Alternatives accumulator @many@ for Composition
composeMany :: (Alternative m, Cat.Category cat) => m (cat a a) -> m (cat a a)
composeMany = manyWith Composition getComposition
-- | Alternatives accumulator @many@ for RevComposition
invComposeMany :: (Alternative m, Cat.Category cat) => m (cat a a) -> m (cat a a)
invComposeMany = manyWith RevComposition getRevComposition