{-# LANGUAGE FlexibleContexts #-} {- Module : examples/Sneaky Copyright : (c) Mark Snyder 2012. License : BSD-style Maintainer : Mark Snyder, msnyde14@gmu.edu Stability : experimental Portability : non-portable (multi-param classes, functional dependencies) -} module Sneaky where import PrivLib import Control.Monad.State import Control.Monad.StateX go = (rune1,rune2) e1 :: (MonadPos m) => Int -> m Int e1 a = putV a >> getV rune1 = runPos 1 (e1 (-3)) e2 :: (MonadState Int m, MonadPos m) => Int -> m Int e2 v = do putV v x <- get y <- getV return (x+y) rune2 = flip runState (-1) . runPosT (-10) $ e2 (-100) -- rune2b v = runPos 7 . flip runStateT 3 $ e2 v {- we can't do this, because PRIV can't be brought into scope. e3 :: (MonadPos Int m) => m Int e3 = do getx PRIV putx PRIV 999 getV -}