flite-0.1.1: Flite/WriterState.hs
module Flite.WriterState where
import Control.Monad
newtype WriterState w s a = WS { runWS :: s -> (s, [w], a) }
instance Monad (WriterState w s) where
return a = WS $ \s -> (s, [], a)
m >>= f = WS $ \s -> let (s0, w0, a) = runWS m s
(s1, w1, b) = runWS (f a) s0
in (s1, w0 ++ w1, b)
instance Functor (WriterState w s) where
fmap = liftM
write :: w -> WriterState w s ()
write w = WS $ \s -> (s, [w], ())
get :: WriterState w s s
get = WS $ \s -> (s, [], s)
set :: s -> WriterState w s ()
set s = WS $ \_ -> (s, [], ())