diff --git a/implementations/javascript/packages/core/src/fold.ts b/implementations/javascript/packages/core/src/fold.ts index 7c418fc..fe04412 100644 --- a/implementations/javascript/packages/core/src/fold.ts +++ b/implementations/javascript/packages/core/src/fold.ts @@ -43,6 +43,32 @@ export interface FoldMethods { embedded(t: Embedded, k: Fold): R; } +export class VoidFold implements FoldMethods { + boolean(b: boolean): void {} + single(f: number): void {} + double(f: number): void {} + integer(i: number): void {} + string(s: string): void {} + bytes(b: Bytes): void {} + symbol(s: symbol): void {} + record(r: Record, Tuple>, T>, k: Fold): void { + k(r.label); + r.forEach(k); + } + array(a: Value[], k: Fold): void { a.forEach(k); } + set(s: Set, k: Fold): void { s.forEach(k); } + dictionary(d: Dictionary, k: Fold): void { + d.forEach((value, key) => { k(key); k(value); }); + } + annotated(a: Annotated, k: Fold): void { k(a.item); a.annotations.forEach(k); } + embedded(_t: Embedded, _k: Fold): void {} +} + +export class ForEachEmbedded extends VoidFold { + constructor(public readonly f: (t: T, k: Fold) => void) { super(); } + embedded(t: Embedded, k: Fold): void { this.f(t.embeddedValue, k); } +} + export abstract class ValueFold implements FoldMethods> { boolean(b: boolean): Value { return b; @@ -193,3 +219,7 @@ export function mapEmbeddeds( { return fold(v, new MapFold(f)); } + +export function forEachEmbedded(v: Value, f: (t: T, k: Fold) => void): void { + return fold(v, new ForEachEmbedded(f)); +}