module Control.Monad.MultiPass.ThreadContext.MonoidTC ( MonoidTC(..) )
where
import Control.Monad.Writer.Strict
import Control.Monad.MultiPass
newtype MonoidTC a = MonoidTC { unwrapMonoidTC :: a }
instance Monoid a => Monoid (MonoidTC a) where
mempty = MonoidTC mempty
mappend (MonoidTC x) (MonoidTC y) =
MonoidTC (mappend x y)
instance Monoid a => ThreadContext r w (MonoidTC a) where
splitThreadContext _ _ _ =
return $ mempty
mergeThreadContext n f x =
execWriterT $
do tell x
sequence_
[ do y <- lift $ f i
tell y
| i <- [0 .. n1]
]
instance Monoid a => NextThreadContext r w tc gc (MonoidTC a) where
nextThreadContext _ _ _ _ =
return mempty