@ng-doc/ui-kit
Version:
<!-- PROJECT LOGO --> <br /> <div align="center"> <a href="https://github.com/ng-doc/ng-doc"> <img src="https://ng-doc.com/assets/images/ng-doc.svg?raw=true" alt="Logo" height="150px"> </a>
99 lines (93 loc) • 2.94 kB
JavaScript
import { Observable, of, pipe } from 'rxjs';
import { startWith, switchMap, map, catchError, tap } from 'rxjs/operators';
import { inject, NgZone } from '@angular/core';
/**
* @param subscribable
*/
function fromSubscribe(subscribable) {
return new Observable((observer) => {
const subscription = subscribable.subscribe((next) => observer.next(next), (error) => observer.error(error), () => observer.complete());
return () => subscription.unsubscribe();
});
}
/**
*
* @param retry
*/
function observableState(retry) {
return (source) => {
let state = {
result: null,
error: null,
pending: false,
};
return (retry ? retry.pipe(startWith(null)) : of(null)).pipe(switchMap(() => source.pipe(
// Map result of observable
map((result) => ({ result, pending: false })),
// Map error of observable
catchError((error) => of({ result: null, error, pending: false })),
// Start from pending state and clear error
startWith({ error: null, pending: true }),
// Merge the current state with new state
tap((updatedState) => (state = { ...state, ...updatedState })), map(() => state))));
};
}
class NgDocZoneDetachSourceOperator {
constructor(ngZone) {
this.ngZone = ngZone;
}
call(observer, source) {
return this.ngZone.runOutsideAngular(() => source.subscribe(observer));
}
}
/**
*
* @param ngZone
*/
function zoneDetachSource(ngZone) {
return (source) => source.lift(new NgDocZoneDetachSourceOperator(ngZone));
}
/**
*
* @param ngZone
*/
function zoneDetach(ngZone) {
return (source) => new Observable((subscriber) => source.subscribe({
next: (value) => ngZone.runOutsideAngular(() => subscriber.next(value)),
error: (error) => ngZone.runOutsideAngular(() => subscriber.error(error)),
complete: () => ngZone.runOutsideAngular(() => subscriber.complete()),
}));
}
/**
*
* @param ngZone
*/
function ngDocZoneAttach(ngZone) {
ngZone = ngZone || inject(NgZone);
return (source) => new Observable((subscriber) => source.subscribe({
next: (value) => ngZone.run(() => subscriber.next(value)),
error: (error) => ngZone.run(() => subscriber.error(error)),
complete: () => ngZone.run(() => subscriber.complete()),
}));
}
/**
*
* @param ngZone
*/
function ngDocZoneDetach(ngZone) {
ngZone = ngZone || inject(NgZone);
return pipe(zoneDetach(ngZone), zoneDetachSource(ngZone));
}
/**
*
* @param ngZone
*/
function ngDocZoneOptimize(ngZone) {
ngZone = ngZone || inject(NgZone);
return pipe(zoneDetach(ngZone), zoneDetachSource(ngZone), ngDocZoneAttach(ngZone));
}
/**
* Generated bundle index. Do not edit.
*/
export { fromSubscribe, ngDocZoneAttach, ngDocZoneDetach, ngDocZoneOptimize, observableState };
//# sourceMappingURL=ng-doc-ui-kit-observables.mjs.map