import { Effect, Exit } from "effect" import type { AstNode } from "./model.js" export type IteratorCursor = { readonly next: Effect.Effect<{ readonly done: boolean; readonly value: unknown }, unknown, R> readonly close: Effect.Effect } export type SyncIteratorRunner = { readonly syncIterator: (value: unknown, node: AstNode) => Effect.Effect | undefined, unknown, R> } export const preserveConsumerError = ( cursor: IteratorCursor, effect: Effect.Effect, ): Effect.Effect => Effect.flatMap(Effect.exit(effect), (exit) => Exit.isSuccess(exit) ? Effect.succeed(exit.value) : Effect.andThen(Effect.exit(cursor.close), Effect.failCause(exit.cause)), )