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}