import { Lambda1, Lambda1_deps, Lambda1_toFunction, Lambda2, Lambda2_deps, Lambda2_toFunction, toSources } from "./Lambda"; import { Transaction } from "./Transaction"; import { StreamWithSend } from "./Stream"; import { Vertex } from "./Vertex"; export class CoalesceHandler { constructor(f : ((l : A, r : A) => A) | Lambda2, out : StreamWithSend) { this.f = Lambda2_toFunction(f); this.out = out; this.out.getVertex__().sources = this.out.getVertex__().sources.concat( toSources(Lambda2_deps(f))); this.accumValid = false; } private f : (l : A, r : A) => A; private out : StreamWithSend; private accumValid : boolean; private accum : A; private verbose : boolean; send_(a : A) { if (this.accumValid) this.accum = this.f(this.accum, a); else { Transaction.currentTransaction.prioritized(this.out.getVertex__(), () => { this.out.send_(this.accum); this.accumValid = false; this.accum = null; }); this.accum = a; this.accumValid = true; } } }