falcor-observable
Version:
An Observable implementation compatible with the Falcor DataSource API. Avoids try/catch.
54 lines (48 loc) • 1.17 kB
JavaScript
// @flow
;
import type {
OperatorFunction,
ISubscription,
ObservableInput
} from "../es-observable";
const { Observable } = require("../es-observable");
function concat<T, E: Error>(
...observables: ObservableInput<T, E>[]
): OperatorFunction<T, T, E> {
return function concatOperator(source: Observable<T, E>): Observable<T, E> {
const clonedObservables = [
source,
...observables.map(o => Observable.from(o))
];
return new Observable(observer => {
let currentSub: ?ISubscription = null;
function recur(index) {
if (index >= clonedObservables.length) {
observer.complete();
return;
}
clonedObservables[index].subscribe({
start(sub) {
currentSub = sub;
},
next(v) {
observer.next(v);
},
error(e) {
observer.error(e);
},
complete() {
recur(index + 1);
}
});
}
recur(0);
return () => {
if (currentSub) {
currentSub.unsubscribe();
}
};
});
};
}
module.exports = { concat };