{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Monoid.IntMap 
    ( module Data.Monoid.Reducer
    , UnionWith(getUnionWith)
    ) where

import Data.Monoid.Reducer (Reducer, unit, cons, snoc, Monoid, mappend, mempty)
import Data.IntMap

newtype UnionWith m = UnionWith { getUnionWith :: IntMap m } 

instance Monoid m => Monoid (UnionWith m) where
    mempty = UnionWith empty
    UnionWith a `mappend` UnionWith b = UnionWith (unionWith mappend a b)

instance Monoid m => Reducer (IntMap m) (UnionWith m) where
    unit = UnionWith