{-# LANGUAGE FlexibleContexts #-} module Sneaky where import PrivLib import Control.Monad.StateX import Control.Monad.State go = (rune1,rune2a,rune2b) e1 :: (MonadFoo Int m) => Int -> m Int e1 a = do x <- getFoo putFoo (x+a) return x rune1 = runFoo 5 (e1 3) e2 :: (MonadState Int m, MonadFoo Int m) => m Int e2 = do x <- get y <- getFoo put y putFoo x return (x+y) rune2a = flip runState 3 . runFooT 5 $ e2 rune2b = runFoo 5 . flip runStateT 3 $ e2