// ets_tracing: off /** * inspired by https://github.com/tusharmath/qio/pull/22 (revised) */ import { _A, _E, _R } from "../../Effect/commons.js" import type * as Utils from "../../Utils/index.js" import type { STM } from "./core.js" import { chain_, succeed, suspend } from "./core.js" export class GenSTM { readonly [_R]!: (_R: R) => void; readonly [_E]!: () => E; readonly [_A]!: () => A constructor(readonly effect: STM) {} *[Symbol.iterator](): Generator, A, any> { return yield this } } const adapter = (_: any, __?: any) => { return new GenSTM(_) } /** * Do simulation using Generators */ export function gen, AEff>( f: (i: { (_: STM): GenSTM }) => Generator ): STM, Utils._E, AEff> { return suspend(() => { const iterator = f(adapter as any) const state = iterator.next() function run( state: IteratorYieldResult | IteratorReturnResult ): STM { if (state.done) { return succeed(state.value) } return chain_(state.value["effect"], (val) => { const next = iterator.next(val) return run(next) }) } return run(state) }) }