import { Task, Sink } from '../interfaces' import { fatalError } from '../util/fatalError' export type RunFn = (time: number, value: T, sink: Sink) => void export class PropagateTask implements Task { private _run: RunFn private value: T private sink: Sink private active: boolean constructor (run: RunFn, value: T, sink: Sink) { this._run = run this.value = value this.sink = sink this.active = true } static event (value: T, sink: Sink): PropagateTask { return new PropagateTask(event, value, sink) } static error (err: Error, sink: Sink): PropagateTask { return new PropagateTask(error, err, sink) } static end (value: T, sink: Sink): PropagateTask { return new PropagateTask(end, value, sink) } run (time: number): void { if (!this.active) return this._run(time, this.value, this.sink) } error (time: number, err: Error): void { if (!this.active) fatalError(err) this.active = false this.sink.error(time, err) } dispose (): void { this.active = false } } function event (time: number, value: T, sink: Sink): void { sink.event(time, value) } function error (time: number, err: Error, sink: Sink): void { sink.error(time, err) } function end (time: number, value: T, sink: Sink): void { sink.end(time, value) }