-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Monoid.Sugar
-- Copyright   :  (c) Edward Kmett 2009
-- License     :  BSD-style
-- Maintainer  :  ekmett@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Syntactic sugar for working with a 'Monoid' and 'Multiplicative' instances 
-- that conflicts with names from the "Prelude".
--
-- > import Prelude hiding ((+),(*),(^))
-- > import Data.Monoid.Sugar
--
-----------------------------------------------------------------------------
--
module Data.Monoid.Sugar
    ( (+)
    , (*)
    , (^) 
    ) where

import Prelude hiding ((*),(+),(^))
import Data.Monoid (Monoid, mappend)
import Data.Monoid.Multiplicative (Multiplicative, times, Log(..))
import qualified Data.Monoid.Combinators as Monoid

infixl 6 + 
infixl 7 *

(+) :: Monoid m => m -> m -> m 
(+) = mappend

(*) :: Multiplicative r => r -> r -> r
(*) = times

(^) :: (Multiplicative r, Integral b) => r -> b -> r
m ^ n =  getLog (Monoid.replicate (Log m) n)