monoids-0.1.5: Data/Monoid/FromString.hs
{-# LANGUAGE FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Monoid.Additive
-- Copyright : (c) Edward Kmett 2009
-- License : BSD-style
-- Maintainer : libraries@haskell.org
-- Stability : experimental
-- Portability : non-portable (overloaded strings, MPTCs)
--
-- Transform any 'Char' 'Reducer' into an 'IsString' instance so it can be
-- used directly with overloaded string literals.
--
-----------------------------------------------------------------------------
module Data.Monoid.FromString
( module Data.Monoid.Reducer
, FromString(FromString,getFromString)
) where
import Control.Functor.Pointed
import Data.Monoid.Generator
import Data.Monoid.Reducer
import Data.Monoid.Instances ()
import GHC.Exts
data FromString m = FromString { getFromString :: m }
instance Monoid m => Monoid (FromString m) where
mempty = FromString mempty
FromString a `mappend` FromString b = FromString (a `mappend` b)
instance (Char `Reducer` m) => Reducer Char (FromString m) where
unit = FromString . unit
instance (Char `Reducer` m) => IsString (FromString m) where
fromString = FromString . reduce
instance Pointed FromString where
point = FromString
instance Copointed FromString where
extract = getFromString
instance Functor FromString where
fmap f (FromString x) = FromString (f x)