import type { EvalInternal } from "@tsplus/stdlib/io/Eval" /** * Runs this computation. * * @tsplus getter Eval run */ export function run(self: Eval): A { let stack: Stack<(e: any) => EvalInternal> | undefined = undefined let a = undefined let curIO = self as EvalInternal | undefined while (curIO != null) { switch (curIO._tag) { case "FlatMap": { switch (curIO.value._tag) { case "Succeed": { curIO = curIO.cont(curIO.value.a()) break } default: { stack = new Stack(curIO.cont, stack) curIO = curIO.value } } break } case "Suspend": { curIO = curIO.f() break } case "Succeed": { a = curIO.a() if (stack) { curIO = stack.value(a) stack = stack.previous } else { curIO = undefined } break } } } // @ts-expect-error return a }