Mirror: 🎩 A tiny but capable push & pull stream library for TypeScript and Flow

chore: Reduce size of ported code (#118)

* Simplify Callbag talkback signal conversion

* Remove symbol fallback for observables

* Merge placeholder functions

* Remove typeof check in delay operator

* Remove rest-spread parameter transform

* Use rest-spread in pipe fn

+5
rollup.config.js
···
buble({
transforms: {
unicodeRegExp: false,
+
defaultParameter: false,
dangerousForOf: true,
dangerousTaggedTemplateString: true,
+
destructuring: false,
asyncAwait: false,
arrow: false,
classes: false,
+
computedProperty: false,
conciseMethodProperty: false,
templateString: false,
objectRestSpread: false,
+
parameterDestructuring: false,
+
spreadRest: false,
},
exclude: 'node_modules/**',
}),
+4 -12
src/callbag.ts
···
-
import { Source, SignalKind, TalkbackKind } from './types';
+
import { Source, SignalKind } from './types';
import { push, start } from './helpers';
interface Callbag<I, O> {
···
if (signal === 0) {
sink(
start(signal => {
-
if (signal === TalkbackKind.Pull) {
-
data(1);
-
} else {
-
data(2);
-
}
+
data(signal + 1);
})
);
} else if (signal === 1) {
sink(push(data));
-
} else if (signal === 2) {
+
} else {
sink(SignalKind.End);
}
});
···
sink(2);
} else if (signal.tag === SignalKind.Start) {
sink(0, (num: number) => {
-
if (num === 1) {
-
signal[0](TalkbackKind.Pull);
-
} else if (num === 2) {
-
signal[0](TalkbackKind.Close);
-
}
+
if (num < 3) signal[0](num - 1);
});
} else {
sink(1, signal[0]);
+1 -3
src/helpers.ts
···
import { TalkbackFn, TeardownFn, Start, Push, SignalKind } from './types';
-
export const talkbackPlaceholder: TalkbackFn = _signal => {
-
/*noop*/
-
};
export const teardownPlaceholder: TeardownFn = () => {
/*noop*/
};
+
export const talkbackPlaceholder: TalkbackFn = teardownPlaceholder;
export function start<T>(talkback: TalkbackFn): Start<T> {
const box: any = [talkback];
+8 -11
src/observable.ts
···
subscribe(observer: ObservableObserver<T>): ObservableSubscription;
}
-
const observableSymbol: unique symbol =
-
typeof Symbol === 'function'
-
? (Symbol as any).observable || ((Symbol as any).observable = Symbol('observable'))
-
: '@@observable';
+
const observableSymbol = (): symbol =>
+
(Symbol as any).observable || ((Symbol as any).observable = Symbol('observable'));
export function fromObservable<T>(input: Observable<T>): Source<T> {
-
const observable: Observable<T> = input[observableSymbol]
-
? (input as any)[observableSymbol]()
-
: input;
+
input = input[observableSymbol()] ? (input as any)[observableSymbol()]() : input;
return sink => {
-
const subscription = observable.subscribe({
+
const subscription = input.subscribe({
next(value: T) {
sink(push(value));
},
···
}
export function toObservable<T>(source: Source<T>): Observable<T> {
-
const observable: Observable<T> = {
+
return {
subscribe(observer: ObservableObserver<T>) {
let talkback = talkbackPlaceholder;
let ended = false;
···
};
return subscription;
},
+
[observableSymbol()]() {
+
return this;
+
},
};
-
observable[observableSymbol] = () => observable;
-
return observable;
}
+1 -1
src/operators.ts
···
return source => sink => {
let active = 0;
source(signal => {
-
if (typeof signal !== 'number' && signal.tag === SignalKind.Start) {
+
if (signal !== SignalKind.End && signal.tag === SignalKind.Start) {
sink(signal);
} else {
active++;
+3 -3
src/pipe.ts
···
consumer: UnaryFn<Source<H>, R>
): R;
-
function pipe() {
-
let x = arguments[0];
-
for (let i = 1, l = arguments.length; i < l; i++) x = arguments[i](x);
+
function pipe(...args: any[]) {
+
let x = args[0];
+
for (let i = 1, l = args.length; i < l; i++) x = args[i](x);
return x;
}