Mirror: 馃帺 A tiny but capable push & pull stream library for TypeScript and Flow
1import { Source, SignalKind } from './types'; 2import { push, start } from './helpers'; 3 4interface Callbag<I, O> { 5 (t: 0, d: Callbag<O, I>): void; 6 (t: 1, d: I): void; 7 (t: 2, d?: any): void; 8} 9 10export function fromCallbag<T>(callbag: Callbag<any, T>): Source<T> { 11 return sink => { 12 callbag(0, (signal: number, data: any) => { 13 if (signal === 0) { 14 sink( 15 start(signal => { 16 data(signal + 1); 17 }) 18 ); 19 } else if (signal === 1) { 20 sink(push(data)); 21 } else { 22 sink(SignalKind.End); 23 } 24 }); 25 }; 26} 27 28export function toCallbag<T>(source: Source<T>): Callbag<any, T> { 29 return (signal: number, sink: any) => { 30 if (signal === 0) { 31 source(signal => { 32 if (signal === SignalKind.End) { 33 sink(2); 34 } else if (signal.tag === SignalKind.Start) { 35 sink(0, (num: number) => { 36 if (num < 3) signal[0](num - 1); 37 }); 38 } else { 39 sink(1, signal[0]); 40 } 41 }); 42 } 43 }; 44}