{-# LANGUAGE UndecidableInstances, TypeOperators, FlexibleContexts, MultiParamTypeClasses, FlexibleInstances #-}
module Data.Monoid.Reducer.With
    ( module Data.Monoid.Reducer
    , WithReducer(WithReducer,runWithReducer)
    , withoutReducer
    ) where

import Data.Monoid.Reducer
import Data.FingerTree

newtype WithReducer c m = WithReducer { runWithReducer :: (m,c) } 

withoutReducer :: c `WithReducer` m -> c
withoutReducer = snd . runWithReducer

instance (c `Reducer` m) => Reducer (c `WithReducer` m) m where
    unit = fst . runWithReducer 

instance (c `Reducer` m) => Measured m (c `WithReducer` m) where
    measure = fst . runWithReducer