module Control.Monad.Eff.Examples.VerboseAddition where
import Control.Monad.Eff
import Control.Monad.Eff.Lift
import Prelude hiding (log)
data Log v where
Log :: String -> Log ()
log :: Member Log r => String -> Eff r ()
log = send . Log
runLogger :: Eff (Log ': r) a -> Eff r (a, [String])
runLogger = handleRelay (\x -> return (x, []))
(\(Log s) k -> k () >>= \(x, ss) -> return (x, s:ss))
runIOLogger :: MemberU2 Lift (Lift IO) r => Eff (Log ': r) a -> Eff r a
runIOLogger = handleRelay return
(\(Log s) k -> lift (putStrLn s) >>= k)
example :: Member Log r => Eff r Int
example = do
log "I'm starting with 1..."
let x = 1
log "and I'm adding 2..."
let y = 2
let r = x + y
log $ "Looks like the result is " ++ show r
return r