packages feed

effect-monad-0.6: examples/Solution1-alt.hs

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

import Control.Monad.State.Lazy

class Monad m => Streaming a m where
    writeS :: [a] -> m ()

class Monad m => Counting m where
    incC :: m ()

-- write :: (Streaming a m, Counting m) => [a] -> m ()
write x = do { writeS x; incC }

instance Monad m => Streaming a (StateT [a] m) where
    writeS y = do x <- get
                  put (x ++ y)

instance Monad m => Counting (StateT Int m) where
    incC = do x <- get
              put (x + 1)

foo = runStateT 0 $ runStateT "" $ write "message"