import Control
.Monad.Reader
data Connection = Connection
data Builder = Builder
data Context = Context { connection :: Connection, builder :: Builder }
no
_action
:: Connection
-> Builder
-> Int -> IO Intno
_action
_ _ i
= return (i
+ 1)
type CBIO b
= ReaderT Context
IO b
liftCBIO
:: (Connection
-> Builder
-> a
-> IO b
) -> (a
-> CBIO b
)liftCBIO f v = do
context <- ask
liftIO (f (connection context) (builder context) v)
cbio_no_action = liftCBIO no_action
runWithInIO
= flip runReaderT
main = do
i <- runWithInIO (Context Connection Builder) $ do
a <- cbio_no_action 20
b <- cbio_no_action 30
aW1wb3J0IENvbnRyb2wuTW9uYWQuUmVhZGVyCgpkYXRhIENvbm5lY3Rpb24gPSBDb25uZWN0aW9uCmRhdGEgQnVpbGRlciA9IEJ1aWxkZXIKCmRhdGEgQ29udGV4dCA9IENvbnRleHQgeyBjb25uZWN0aW9uIDo6IENvbm5lY3Rpb24sIGJ1aWxkZXIgOjogQnVpbGRlciB9Cgpub19hY3Rpb24gOjogQ29ubmVjdGlvbiAtPiBCdWlsZGVyIC0+IEludCAtPiBJTyBJbnQKbm9fYWN0aW9uIF8gXyBpID0gcmV0dXJuIChpICsgMSkKCgp0eXBlIENCSU8gYiA9IFJlYWRlclQgQ29udGV4dCBJTyBiCgpsaWZ0Q0JJTyA6OiAoQ29ubmVjdGlvbiAtPiBCdWlsZGVyIC0+IGEgLT4gSU8gYikgLT4gKGEgLT4gQ0JJTyBiKQpsaWZ0Q0JJTyBmIHYgPSBkbwoJY29udGV4dCA8LSBhc2sKCWxpZnRJTyAoZiAoY29ubmVjdGlvbiBjb250ZXh0KSAoYnVpbGRlciBjb250ZXh0KSB2KQoKY2Jpb19ub19hY3Rpb24gPSBsaWZ0Q0JJTyBub19hY3Rpb24KCnJ1bldpdGhJbklPID0gZmxpcCBydW5SZWFkZXJUCgoKbWFpbiA9IGRvCglpIDwtIHJ1bldpdGhJbklPIChDb250ZXh0IENvbm5lY3Rpb24gQnVpbGRlcikgJCBkbwoJCWEgPC0gY2Jpb19ub19hY3Rpb24gMjAKCQlsaWZ0SU8gJCBwdXRTdHJMbiAiSGFsZndheSB0aHJvdWdoISIKCQliIDwtIGNiaW9fbm9fYWN0aW9uIDMwCgkJcmV0dXJuIChhICsgYikKCXB1dFN0ckxuICQgc2hvdyBpCg==