-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Monoid.Additive.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
    ( module Data.Monoid.Multiplicative
    , module Data.Ring.Semi.Natural
    , (+)
    , (*)
    , (^)
    ) where

import Prelude hiding ((*),(^),(+))
import Data.Monoid.Multiplicative
import Data.Ring.Semi.Natural
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 => r -> Natural -> r
r ^ n = getLog (Monoid.replicate (Log r) n)