module Data.Monoid1
( Unit1(..), Append1(..), Monoid1
) where
import Control.Applicative (Const (..), WrappedMonad (..))
import qualified Data.IntMap.Strict as IM
import qualified Data.Map as M
import Data.Monoid
class Unit1 m where
empty1 :: m a
instance Unit1 [] where
empty1 = mempty
instance Unit1 IM.IntMap where
empty1 = mempty
instance Unit1 (M.Map k) where
empty1 = M.empty
instance Monoid a => Unit1 (Const a) where
empty1 = mempty
instance Unit1 First where
empty1 = mempty
instance Unit1 Last where
empty1 = mempty
class Append1 m where
append1 :: m a -> m a -> m a
instance Append1 [] where
append1 = mappend
instance Append1 IM.IntMap where
append1 = mappend
instance Ord k => Append1 (M.Map k) where
append1 = mappend
instance Monoid a => Append1 (Const a) where
append1 = mappend
instance Append1 First where
append1 = mappend
instance Append1 Last where
append1 = mappend
class (Unit1 m, Append1 m) => Monoid1 m where
instance Monoid1 [] where
instance Monoid1 IM.IntMap where
instance Ord k => Monoid1 (M.Map k) where
instance Monoid a => Monoid1 (Const a) where
instance Monoid1 First where
instance Monoid1 Last where
instance Unit1 m => Unit1 (WrappedMonad m) where
empty1 = WrapMonad empty1
instance Append1 m => Append1 (WrappedMonad m) where
WrapMonad x `append1` WrapMonad y = WrapMonad $ x `append1` y
instance Monoid1 m => Monoid1 (WrappedMonad m) where