module ContSpec where
import Control.Effect
import Control.Effect.Cont
import Control.Effect.Reader
import Test.Hspec
test :: Effs '[Shift (Int, Int), Reader Int] m => m (Int, Int)
test = do
i <- local @Int (*2) $
shift @(Int, Int) $ \c ->
local @Int (*3) (ask @Int)
>>= local @Int (*5) . c
j <- local @Int (*7) $ ask @Int
return (i, j)
test1 :: Effs '[Shift (Int, Int), Reader Int] m => m (Int, Int)
test1 = do
i <- shift @(Int, Int) $ \c ->
local @Int (*3) (ask @Int)
>>= local @Int (*5) . c
j <- local @Int (*7) $ ask @Int
return (i, j)
spec :: Spec
spec = do
describe "runShift" $ do
it "neither local nor global HO-actions should affect a continuation,\
\ whether applied inside or outside a 'shift'" $ do
let (i, j) = run $ runReader @Int 1 $ runShift $ test
i `shouldBe` 6 -- 2 * 3
j `shouldBe` 7
let (i', j') = run $ runShift $ runReader @Int 1 $ test
i' `shouldBe` 6
j' `shouldBe` 7