@zodiac-ui/ng-observable
Version:
Create powerful reactive components with Angular. AoT compatible and Ivy ready.
162 lines • 12 kB
JavaScript
/**
* @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==