UNPKG

@zodiac-ui/ng-observable

Version:

Create powerful reactive components with Angular. AoT compatible and Ivy ready.

162 lines 12 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from "@angular/core"; import { Subscription, from } from "rxjs"; import { Callable } from "./internals/callable"; import { isTeardownLogic } from "./internals/type-guards"; /** * @param {?} sub * @return {?} */ function createStream(sub) { return (/** * @param {...?} targets * @return {?} */ function stream(...targets) { return (/** * @param {...?} sources * @return {?} */ function (...sources) { for (const source of sources) { sub.add(from(source).subscribe((/** * @param {?} value * @return {?} */ value => { for (const target of targets) { if (typeof target === "function") { target(value); } else { target.next(value); } } }))); } }); }); } // WARNING: interface has both a type and a value, skipping emit /** * Automatically subscribes to source observables and forwards their values to target observers while * discarding error and completion events. Cleans up all subscriptions when the stream completes by manually calling `complete` * or when the bound injector is destroyed. * * \@usageNotes * * Basic usage * * ```ts * const stream = new Stream() * const dest = new Subject() * const source = interval(1000) * * stream(dest)(source) * * stream.sink = source * stream.add(source) * * // unsubscribe from all sources * stream.complete() * ``` * * With `State` * * ```typescript * * \@Component({ * viewProviders: [StateFactory] // or providers * }) * export class MyComponent { * count: number * * constructor(stateFactory: StateFactory) { * const state = stateFactory.create(this) * * // update count once per second * // automatically unsubscribe when component is destroyed * stream(state)(interval(1000).pipe( * map(count => ({ count })) * )) * } * } * ``` * * \@publicApi */ export class Stream extends Callable { constructor() { /** @type {?} */ const sub = new Subscription(); super(createStream(sub)); this.sub = sub; } /** * A subscription or an observable of teardown logic that will be cleaned up * when the stream ends. * @param {?} sinkable * @return {?} */ set sink(sinkable) { if (!sinkable) { return; } if (isTeardownLogic(sinkable)) { this.sub.add(sinkable); } else if (Array.isArray(sinkable)) { for (const stream of sinkable) { this.sink = stream; } } else { this.sink = from(sinkable).subscribe((/** * @param {?} stream * @return {?} */ stream => { this.sink = stream; })); } } /** * Alternative to {\@link sink} * * @param {...?} sinkables A series of {\@link Sinkable} to be cleaned up when the stream ends. * @return {?} */ add(...sinkables) { this.sink = sinkables; } /** * Completes the stream and unsubscribes from all sources. * @return {?} */ complete() { this.sub.unsubscribe(); } /** * `OnDestroy` hook called by Angular when the bound injector is destroyed * @return {?} */ ngOnDestroy() { this.complete(); } } Stream.decorators = [ { type: Injectable } ]; /** @nocollapse */ Stream.ctorParameters = () => []; if (false) { /** * @type {?} * @private */ Stream.prototype.sub; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHpvZGlhYy11aS9uZy1vYnNlcnZhYmxlLyIsInNvdXJjZXMiOlsibGliL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFpQyxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDeEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTs7Ozs7QUFFekQsU0FBUyxZQUFZLENBQUMsR0FBaUI7SUFDbkM7Ozs7SUFBTyxTQUFTLE1BQU0sQ0FBQyxHQUFHLE9BQXVEO1FBQzdFOzs7O1FBQU8sVUFBUyxHQUFHLE9BQStCO1lBQzlDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO2dCQUMxQixHQUFHLENBQUMsR0FBRyxDQUNILElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O2dCQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMzQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTt3QkFDMUIsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7NEJBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTt5QkFDaEI7NkJBQU07NEJBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTt5QkFDckI7cUJBQ0o7Z0JBQ0wsQ0FBQyxFQUFDLENBQ0wsQ0FBQTthQUNKO1FBQ0wsQ0FBQyxFQUFBO0lBQ0wsQ0FBQyxFQUFBO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRERCxNQUFNLE9BQU8sTUFBTyxTQUFRLFFBQWtCO0lBd0IxQzs7Y0FDVSxHQUFHLEdBQUcsSUFBSSxZQUFZLEVBQUU7UUFDOUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2xCLENBQUM7Ozs7Ozs7SUFyQkQsSUFBVyxJQUFJLENBQUMsUUFBK0I7UUFDM0MsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLE9BQU07U0FDVDtRQUNELElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQ3pCO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFO2dCQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQTthQUNyQjtTQUNKO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFBO1lBQ3RCLENBQUMsRUFBQyxDQUFBO1NBQ0w7SUFDTCxDQUFDOzs7Ozs7O0lBYU0sR0FBRyxDQUFDLEdBQUcsU0FBcUI7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUE7SUFDekIsQ0FBQzs7Ozs7SUFLTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUMxQixDQUFDOzs7OztJQUtNLFdBQVc7UUFDZCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDbkIsQ0FBQzs7O1lBcERKLFVBQVU7Ozs7Ozs7OztJQUVQLHFCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBOZXh0T2JzZXJ2ZXIsIE9ic2VydmFibGVJbnB1dCwgZnJvbSB9IGZyb20gXCJyeGpzXCJcclxuaW1wb3J0IHsgQ2FsbGFibGUgfSBmcm9tIFwiLi9pbnRlcm5hbHMvY2FsbGFibGVcIlxyXG5pbXBvcnQgeyBTaW5rYWJsZSB9IGZyb20gXCIuL2ludGVyZmFjZXNcIlxyXG5pbXBvcnQgeyBpc1RlYXJkb3duTG9naWMgfSBmcm9tIFwiLi9pbnRlcm5hbHMvdHlwZS1ndWFyZHNcIlxyXG5cclxuZnVuY3Rpb24gY3JlYXRlU3RyZWFtKHN1YjogU3Vic2NyaXB0aW9uKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gc3RyZWFtKC4uLnRhcmdldHM6IChOZXh0T2JzZXJ2ZXI8YW55PiB8ICgodmFsdWU6IGFueSkgPT4gdm9pZCkpW10pIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oLi4uc291cmNlczogT2JzZXJ2YWJsZUlucHV0PGFueT5bXSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBzdWIuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20oc291cmNlKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQubmV4dCh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTdHJlYW1GbiA9IDxUPihcclxuICAgIC4uLnRhcmdldHM6IChOZXh0T2JzZXJ2ZXI8VD4gfCAoKHZhbHVlOiBhbnkpID0+IHZvaWQpKVtdXHJcbikgPT4gKC4uLnNvdXJjZXM6IE9ic2VydmFibGVJbnB1dDxUPltdKSA9PiB2b2lkXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbSBleHRlbmRzIFN0cmVhbUZuIHtcclxuICAgIDxUPiguLi50YXJnZXRzOiAoTmV4dE9ic2VydmVyPFQ+IHwgKCh2YWx1ZTogYW55KSA9PiB2b2lkKSlbXSk6IChcclxuICAgICAgICAuLi5zb3VyY2VzOiBPYnNlcnZhYmxlSW5wdXQ8VD5bXVxyXG4gICAgKSA9PiB2b2lkXHJcbn1cclxuXHJcbi8qKlxyXG4qIEF1dG9tYXRpY2FsbHkgc3Vic2NyaWJlcyB0byBzb3VyY2Ugb2JzZXJ2YWJsZXMgYW5kIGZvcndhcmRzIHRoZWlyIHZhbHVlcyB0byB0YXJnZXQgb2JzZXJ2ZXJzIHdoaWxlXHJcbiAgICAqIGRpc2NhcmRpbmcgZXJyb3IgYW5kIGNvbXBsZXRpb24gZXZlbnRzLiBDbGVhbnMgdXAgYWxsIHN1YnNjcmlwdGlvbnMgd2hlbiB0aGUgc3RyZWFtIGNvbXBsZXRlcyBieSBtYW51YWxseSBjYWxsaW5nIGBjb21wbGV0ZWBcclxuKiBvciB3aGVuIHRoZSBib3VuZCBpbmplY3RvciBpcyBkZXN0cm95ZWQuXHJcbipcclxuKiBAdXNhZ2VOb3Rlc1xyXG4qXHJcbiogQmFzaWMgdXNhZ2VcclxuKlxyXG4qIGBgYHRzXHJcbiAqIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oKVxyXG4gKiBjb25zdCBkZXN0ID0gbmV3IFN1YmplY3QoKVxyXG4gKiBjb25zdCBzb3VyY2UgPSBpbnRlcnZhbCgxMDAwKVxyXG4gKlxyXG4gKiBzdHJlYW0oZGVzdCkoc291cmNlKVxyXG4gKlxyXG4gKiBzdHJlYW0uc2luayA9IHNvdXJjZVxyXG4gKiBzdHJlYW0uYWRkKHNvdXJjZSlcclxuICpcclxuICogLy8gdW5zdWJzY3JpYmUgZnJvbSBhbGwgc291cmNlc1xyXG4gKiBzdHJlYW0uY29tcGxldGUoKVxyXG4gKiBgYGBcclxuKlxyXG4qIFdpdGggYFN0YXRlYFxyXG4qXHJcbiogYGBgdHlwZXNjcmlwdFxyXG4gKlxyXG4gKiBAQ29tcG9uZW50KHtcclxuICogICAgIHZpZXdQcm92aWRlcnM6IFtTdGF0ZUZhY3RvcnldIC8vIG9yIHByb3ZpZGVyc1xyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xyXG4gKiAgICAgY291bnQ6IG51bWJlclxyXG4gKlxyXG4gKiAgICAgY29uc3RydWN0b3Ioc3RhdGVGYWN0b3J5OiBTdGF0ZUZhY3RvcnkpIHtcclxuICogICAgICAgICBjb25zdCBzdGF0ZSA9IHN0YXRlRmFjdG9yeS5jcmVhdGUodGhpcylcclxuICpcclxuICogICAgICAgICAvLyB1cGRhdGUgY291bnQgb25jZSBwZXIgc2Vjb25kXHJcbiAqICAgICAgICAgLy8gYXV0b21hdGljYWxseSB1bnN1YnNjcmliZSB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICogICAgICAgICBzdHJlYW0oc3RhdGUpKGludGVydmFsKDEwMDApLnBpcGUoXHJcbiAqICAgICAgICAgICAgIG1hcChjb3VudCA9PiAoeyBjb3VudCB9KSlcclxuICogICAgICAgICApKVxyXG4gKiAgICAgfVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4qXHJcbiogQHB1YmxpY0FwaVxyXG4qL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTdHJlYW0gZXh0ZW5kcyBDYWxsYWJsZTxTdHJlYW1Gbj4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzdWJzY3JpcHRpb24gb3IgYW4gb2JzZXJ2YWJsZSBvZiB0ZWFyZG93biBsb2dpYyB0aGF0IHdpbGwgYmUgY2xlYW5lZCB1cFxyXG4gICAgICogd2hlbiB0aGUgc3RyZWFtIGVuZHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgc2luayhzaW5rYWJsZTogU2lua2FibGUgfCBTaW5rYWJsZVtdKSB7XHJcbiAgICAgICAgaWYgKCFzaW5rYWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzVGVhcmRvd25Mb2dpYyhzaW5rYWJsZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWIuYWRkKHNpbmthYmxlKVxyXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzaW5rYWJsZSkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdHJlYW0gb2Ygc2lua2FibGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2luayA9IHN0cmVhbVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zaW5rID0gZnJvbShzaW5rYWJsZSkuc3Vic2NyaWJlKHN0cmVhbSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbmsgPSBzdHJlYW1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpXHJcbiAgICAgICAgc3VwZXIoY3JlYXRlU3RyZWFtKHN1YikpXHJcbiAgICAgICAgdGhpcy5zdWIgPSBzdWJcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsdGVybmF0aXZlIHRvIHtAbGluayBzaW5rfVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzaW5rYWJsZXMgQSBzZXJpZXMgb2Yge0BsaW5rIFNpbmthYmxlfSB0byBiZSBjbGVhbmVkIHVwIHdoZW4gdGhlIHN0cmVhbSBlbmRzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkKC4uLnNpbmthYmxlczogU2lua2FibGVbXSkge1xyXG4gICAgICAgIHRoaXMuc2luayA9IHNpbmthYmxlc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGxldGVzIHRoZSBzdHJlYW0gYW5kIHVuc3Vic2NyaWJlcyBmcm9tIGFsbCBzb3VyY2VzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29tcGxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogYE9uRGVzdHJveWAgaG9vayBjYWxsZWQgYnkgQW5ndWxhciB3aGVuIHRoZSBib3VuZCBpbmplY3RvciBpcyBkZXN0cm95ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuY29tcGxldGUoKVxyXG4gICAgfVxyXG59XHJcbiJdfQ==