UNPKG

@jahed/sparql-engine

Version:

SPARQL query engine for servers and web browsers.

140 lines 3.92 kB
// SPDX-License-Identifier: MIT import { bufferCount, catchError, concat, defaultIfEmpty, distinct, EMPTY, endWith, filter, finalize, first, from, map, mergeMap, Observable, of, reduce, shareReplay, skip, Subscriber, take, tap, toArray, } from "rxjs"; import { PipelineEngine } from "./pipeline-engine.js"; const flatMap = mergeMap; /** * A StreamPipelineInput implemented using Rxjs' subscribers. */ export class RxjsStreamInput { _subscriber; constructor(subscriber) { this._subscriber = subscriber; } next(value) { this._subscriber.next(value); } complete() { this._subscriber.complete(); } error(err) { this._subscriber.error(err); } } /** * A pipeline implemented using Rx.js */ export default class RxjsPipeline extends PipelineEngine { empty() { return EMPTY; } of(...values) { return of(...values); } from(x) { return from(x); } fromAsync(cb) { return new Observable((subscriber) => { cb(new RxjsStreamInput(subscriber)); }); } clone(stage) { return stage.pipe(shareReplay(5)); } catch(input, handler) { return input.pipe(catchError((err) => { if (handler === undefined) { throw err; } else { return handler(err); } })); } merge(...inputs) { return concat(...inputs); } map(input, mapper) { return input.pipe(map(mapper)); } flatMap(input, mapper) { return input.pipe(flatMap(mapper)); } mergeMap(input, mapper) { return input.pipe(mergeMap(mapper)); } mergeMapAsync(input, mapper) { return input.pipe(mergeMap((v) => from(Promise.resolve(mapper(v))).pipe(mergeMap((n) => n)))); } filter(input, predicate) { return input.pipe(filter(predicate)); } filterAsync(input, predicate) { return input.pipe(flatMap((v) => from(Promise.resolve(predicate(v))).pipe(filter((b) => b), map(() => v)))); } finalize(input, callback) { return input.pipe(finalize(callback)); } reduce(input, reducer, initial) { return input.pipe(reduce(reducer, initial)); } limit(input, stopAfter) { return input.pipe(take(stopAfter)); } skip(input, toSkip) { return input.pipe(skip(toSkip)); } distinct(input, selector) { return input.pipe(distinct(selector)); } defaultValues(input, ...values) { if (values.length === 0) { return input; } else if (values.length === 1) { return input.pipe(defaultIfEmpty(values[0])); } else { return new Observable((subscriber) => { let isEmpty = true; return input.subscribe({ next: (x) => { isEmpty = false; subscriber.next(x); }, error: (err) => subscriber.error(err), complete: () => { if (isEmpty) { values.forEach((v) => subscriber.next(v)); } subscriber.complete(); }, }); }); } } bufferCount(input, count) { return input.pipe(bufferCount(count)); } forEach(input, cb) { input .forEach(cb) .then() .catch((err) => { throw err; }); } first(input) { return input.pipe(first()); } endWith(input, values) { return input.pipe(endWith(...values)); } tap(input, cb) { return input.pipe(tap(cb)); } collect(input) { return input.pipe(toArray()); } } //# sourceMappingURL=rxjs-pipeline.js.map