R) case Finish(finishWith: R) case Pause(continuation: C => CUCH[S, R]) def flatMap[R2](f: R => CUCH[C, R2]): CUCH[C, R2] = this match { case Continue(continueWith) => f(continueWith) case Finish(finishWith) => f(finishWith) case Pause(continuation) => Pause(x => continuation(x).flatMap(f)) } def map[R2](f: R => R2): CUCH[C, R2] = this.flatMap(x => Finish(f(x))) }
U, R], value: C) : Eff[U, R] = eff match { case Pure(r) => Pure(r) case Impure(Value(UseContext(typeConv)), k) => runContext(k(typeConv(value)), value) case Impure(NextType(u), k) => Impure(u, c => runContext(k(c), value)) }