I'm not sure, whether this is applicable to your situation, but here is example of how to mix multiple resets:
type Proc = Unit => Unit
val resume = reset {
shift { k1: Proc =>
reset {
shift { k2: Proc =>
println(1)
() => k2(); k1()
}
println(3)
}
}
println(2)
}
// 1
resume()
// 3
// 2
Update: And here is how to use this with methods:
def f(): Unit @cpsParam[Unit, () => Unit] = {
println(0)
shift { k1: Proc =>
reset {
shift { k2: Proc =>
println(1)
() => k2(); k1()
}
println(2)
}
}
println(3)
}
val continue = reset {
println(-1)
f()
println(4)
}
println("...")
continue()
Prints:
-1
0
1
...
2
3
4
And here is what to do if you don't want to suspend everything after call to f until the ending of reset:
reset {
println(-1)
shift { k: Proc =>
reset{f()}()
k()
}
println(4)
}
println("...")
Prints:
-1
0
1
2
3
4
...