monoids-0.1.10: Data/Monoid/Instances.hs
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances, OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Monoid.Instances
-- Copyright : (c) Edward Kmett 2009
-- License : BSD-style
-- Maintainer : libraries@haskell.org
-- Stability : experimental
-- Portability : portable
--
-- A collection of orphan instance declarations for Monoids that should
-- eventually be pushed back down to the source packages.
--
-- Every package that uses these instances includes this package internally.
--
-- Includes:
--
-- * 'Monoid' instances for the 'Monad' transformers from the mtl package
--
-- * A 'Monoid' instance for the 'ParsecT' 'Monad' from parsec-3.
--
-- * 'IsString' instances for tuples of 'IsString' for overloaded string support.
--
-- * A 'Monoid' instance for the 'FingerTree' in the fingertree package
--
-- * 'Monoid' instances for 'Int', 'Integer', and 'Ratio' using @(+,0)@
--
-- This module is automatically included everywhere this functionality is required
-- within this package. You should only have to import this module yourself if you
-- want these instances for your own purposes.
-----------------------------------------------------------------------------
module Data.Monoid.Instances where
import Control.Monad.Reader
import qualified Control.Monad.RWS.Lazy as LRWS
import qualified Control.Monad.RWS.Strict as SRWS
import qualified Control.Monad.State.Lazy as LState
import qualified Control.Monad.State.Strict as SState
import Control.Monad.Writer
import qualified Control.Monad.Writer.Strict as SWriter
import Data.String
import Data.Ratio
import Data.FingerTree
import Text.Parsec.Prim
-- orphan Monoid instances for Monad Transformers
instance (MonadPlus m, Monoid w) => Monoid (SWriter.WriterT w m n) where
mempty = mzero
mappend = mplus
instance (MonadPlus m, Monoid w) => Monoid (WriterT w m n) where
mempty = mzero
mappend = mplus
instance (MonadPlus m, Monoid w) => Monoid (SRWS.RWST r w s m n) where
mempty = mzero
mappend = mplus
instance (MonadPlus m, Monoid w) => Monoid (LRWS.RWST r w s m n) where
mempty = mzero
mappend = mplus
instance MonadPlus m => Monoid (ReaderT e m n) where
mempty = mzero
mappend = mplus
instance MonadPlus m => Monoid (SState.StateT s m n) where
mempty = mzero
mappend = mplus
instance MonadPlus m => Monoid (LState.StateT s m n) where
mempty = mzero
mappend = mplus
-- orphan, which should be in Data.FingerTree
instance Measured v a => Monoid (FingerTree v a) where
mempty = empty
mappend = (><)
-- orphan, which should be in Parsec
instance Stream s m t => Monoid (ParsecT s u m a) where
mempty = mzero
a `mappend` b = try a <|> b
-- orphan, perhaps should be in Data.String
instance (IsString a, IsString b) => IsString (a,b) where
fromString a = (fromString a, fromString a)
instance (IsString a, IsString b, IsString c) => IsString (a,b,c) where
fromString a = (fromString a, fromString a, fromString a)
instance (IsString a, IsString b, IsString c, IsString d) => IsString (a,b,c,d) where
fromString a = (fromString a, fromString a, fromString a, fromString a)
instance (IsString a, IsString b, IsString c, IsString d, IsString e) => IsString (a,b,c,d,e) where
fromString a = (fromString a, fromString a, fromString a, fromString a, fromString a)
instance Monoid Int where
mempty = 0
mappend = (+)
instance Monoid Integer where
mempty = 0
mappend = (+)
instance Integral m => Monoid (Ratio m) where
mempty = 0
mappend = (+)