{-# LANGUAGE FlexibleInstances #-} {-# OPTIONS_GHC -fno-warn-tabs #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Hcompta.Lib.Data.Monoid where import Control.Monad (Monad(..), liftM2) import Control.Monad.Trans.State.Strict as ST import Data.Monoid (Monoid(..)) import qualified Hcompta.Lib.Control.Monad.Classes as MC import System.IO (IO) -- * Class 'Monoid1' (contain orphan instances) -- | 'Monoid' lifted to unary type constructor. class Monoid1 expr where mempty1 :: Monoid a => expr a mappend1 :: Monoid a => expr a -> expr a -> expr a instance Monoid1 IO where mempty1 = mempty mappend1 = mappend instance (Monoid1 m, Monad m) => Monoid1 (ST.StateT s m) where mempty1 = mempty mappend1 = mappend instance (Monad m, Monoid a) => Monoid (ST.StateT s m a) where mempty = return mempty mappend = liftM2 mappend instance Monoid a => Monoid (IO a) where mempty = return mempty mappend = liftM2 mappend instance (Monoid1 m, Monad m) => Monoid1 (MC.WriterT w m) where mempty1 = mempty mappend1 = mappend instance (Monad m, Monoid a) => Monoid (MC.WriterT w m a) where mempty = return mempty mappend = liftM2 mappend