##// END OF EJS Templates
Working sandbox
Working sandbox

File last commit:

r97:8b413dc7fc42 v1.3
r99:908c1ce6ce6d v1.3
Show More
observable.ts
34 lines | 907 B | video/mp2t | TypeScriptLexer
import { IDestroyable } from "@implab/core-amd/interfaces";
export interface Sink<T> {
next: (value: T) => void;
error: (e: unknown) => void;
complete: () => void;
}
export type Consumer<T> = Partial<Sink<T>>;
export type Producer<T> = (sink: Sink<T>) => (void | (() => void));
export interface Observable<T> {
on(consumer: Partial<Sink<T>>): IDestroyable;
}
const noop = () => {};
const sink = <T>(consumer: Consumer<T>) => {
const { next = noop, error = noop, complete = noop } = consumer;
let done = false;
return {
next: (value: T) => done && next(value),
error: (e: unknown) => done && (done = true, error(e)),
complete: () => done && (done = true, complete())
};
}
export const observe = <T>(producer: Producer<T>) : Observable<T> => ({
on: (consumer: Consumer<T>) => ({
destroy: producer(sink(consumer)) ?? noop
})
});