{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} module Data.Monoid.Record where import Data.Monoid ( Any(..), Last(..), Monoid(..) ) add :: Monoid m => (a -> m) -> (m -> a -> a) -> m -> a -> a add getter setter x y = setter (getter y `mappend` x) y class Monoid m => Wrapper m a | m -> a where wrap :: a -> m addP :: (b -> m) -> (m -> b -> b) -> a -> b -> b addP getter setter = add getter setter . wrap instance Wrapper Any Bool where wrap = Any instance Wrapper (Last a) a where wrap = Last . return instance Wrapper [a] [a] where wrap = id