@dereekb/rxjs 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +7 -0
  2. package/package.json +13 -0
  3. package/src/index.d.ts +1 -0
  4. package/src/index.js +5 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/index.d.ts +6 -0
  7. package/src/lib/index.js +10 -0
  8. package/src/lib/index.js.map +1 -0
  9. package/src/lib/iterator/index.d.ts +6 -0
  10. package/src/lib/iterator/index.js +10 -0
  11. package/src/lib/iterator/index.js.map +1 -0
  12. package/src/lib/iterator/iteration.accumulator.d.ts +56 -0
  13. package/src/lib/iterator/iteration.accumulator.js +63 -0
  14. package/src/lib/iterator/iteration.accumulator.js.map +1 -0
  15. package/src/lib/iterator/iteration.accumulator.rxjs.d.ts +14 -0
  16. package/src/lib/iterator/iteration.accumulator.rxjs.js +35 -0
  17. package/src/lib/iterator/iteration.accumulator.rxjs.js.map +1 -0
  18. package/src/lib/iterator/iteration.d.ts +58 -0
  19. package/src/lib/iterator/iteration.js +3 -0
  20. package/src/lib/iterator/iteration.js.map +1 -0
  21. package/src/lib/iterator/iteration.mapped.d.ts +38 -0
  22. package/src/lib/iterator/iteration.mapped.js +36 -0
  23. package/src/lib/iterator/iteration.mapped.js.map +1 -0
  24. package/src/lib/iterator/iteration.mapped.page.d.ts +25 -0
  25. package/src/lib/iterator/iteration.mapped.page.js +36 -0
  26. package/src/lib/iterator/iteration.mapped.page.js.map +1 -0
  27. package/src/lib/iterator/iteration.next.d.ts +27 -0
  28. package/src/lib/iterator/iteration.next.js +55 -0
  29. package/src/lib/iterator/iteration.next.js.map +1 -0
  30. package/src/lib/iterator/iterator.page.d.ts +172 -0
  31. package/src/lib/iterator/iterator.page.js +238 -0
  32. package/src/lib/iterator/iterator.page.js.map +1 -0
  33. package/src/lib/loading/index.d.ts +7 -0
  34. package/src/lib/loading/index.js +11 -0
  35. package/src/lib/loading/index.js.map +1 -0
  36. package/src/lib/loading/loading.context.d.ts +8 -0
  37. package/src/lib/loading/loading.context.js +3 -0
  38. package/src/lib/loading/loading.context.js.map +1 -0
  39. package/src/lib/loading/loading.context.simple.d.ts +17 -0
  40. package/src/lib/loading/loading.context.simple.js +40 -0
  41. package/src/lib/loading/loading.context.simple.js.map +1 -0
  42. package/src/lib/loading/loading.context.state.d.ts +33 -0
  43. package/src/lib/loading/loading.context.state.js +52 -0
  44. package/src/lib/loading/loading.context.state.js.map +1 -0
  45. package/src/lib/loading/loading.context.state.model.d.ts +18 -0
  46. package/src/lib/loading/loading.context.state.model.js +37 -0
  47. package/src/lib/loading/loading.context.state.model.js.map +1 -0
  48. package/src/lib/loading/loading.context.state.page.d.ts +21 -0
  49. package/src/lib/loading/loading.context.state.page.js +46 -0
  50. package/src/lib/loading/loading.context.state.page.js.map +1 -0
  51. package/src/lib/loading/loading.context.value.d.ts +19 -0
  52. package/src/lib/loading/loading.context.value.js +36 -0
  53. package/src/lib/loading/loading.context.value.js.map +1 -0
  54. package/src/lib/loading/loading.state.d.ts +90 -0
  55. package/src/lib/loading/loading.state.js +188 -0
  56. package/src/lib/loading/loading.state.js.map +1 -0
  57. package/src/lib/lock.d.ts +56 -0
  58. package/src/lib/lock.js +109 -0
  59. package/src/lib/lock.js.map +1 -0
  60. package/src/lib/object.d.ts +10 -0
  61. package/src/lib/object.js +25 -0
  62. package/src/lib/object.js.map +1 -0
  63. package/src/lib/rxjs/array.d.ts +32 -0
  64. package/src/lib/rxjs/array.js +54 -0
  65. package/src/lib/rxjs/array.js.map +1 -0
  66. package/src/lib/rxjs/boolean.d.ts +5 -0
  67. package/src/lib/rxjs/boolean.js +12 -0
  68. package/src/lib/rxjs/boolean.js.map +1 -0
  69. package/src/lib/rxjs/index.d.ts +6 -0
  70. package/src/lib/rxjs/index.js +10 -0
  71. package/src/lib/rxjs/index.js.map +1 -0
  72. package/src/lib/rxjs/loading.d.ts +5 -0
  73. package/src/lib/rxjs/loading.js +12 -0
  74. package/src/lib/rxjs/loading.js.map +1 -0
  75. package/src/lib/rxjs/number.d.ts +5 -0
  76. package/src/lib/rxjs/number.js +12 -0
  77. package/src/lib/rxjs/number.js.map +1 -0
  78. package/src/lib/rxjs/rxjs.d.ts +7 -0
  79. package/src/lib/rxjs/rxjs.js +32 -0
  80. package/src/lib/rxjs/rxjs.js.map +1 -0
  81. package/src/lib/rxjs/value.d.ts +18 -0
  82. package/src/lib/rxjs/value.js +37 -0
  83. package/src/lib/rxjs/value.js.map +1 -0
  84. package/src/lib/subscription.d.ts +28 -0
  85. package/src/lib/subscription.js +68 -0
  86. package/src/lib/subscription.js.map +1 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoadingStateLoadingContext = void 0;
4
+ const util_1 = require("@dereekb/util");
5
+ const rxjs_1 = require("@dereekb/rxjs");
6
+ const operators_1 = require("rxjs/operators");
7
+ const loading_context_state_1 = require("./loading.context.state");
8
+ /**
9
+ * LoadingContext implementation for a LoadingState.
10
+ */
11
+ class LoadingStateLoadingContext extends loading_context_state_1.AbstractLoadingStateLoadingContext {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.model$ = this.stream$.pipe((0, operators_1.map)(x => x.model), (0, operators_1.shareReplay)(1));
15
+ this.modelAfterLoaded$ = this.stream$.pipe((0, operators_1.filter)(x => !x.loading), (0, operators_1.map)(x => x.model), (0, operators_1.shareReplay)(1));
16
+ }
17
+ loadingEventForLoadingPair(pair, { showLoadingOnNoModel } = {}) {
18
+ let loading = false;
19
+ const error = pair === null || pair === void 0 ? void 0 : pair.error;
20
+ const model = pair === null || pair === void 0 ? void 0 : pair.model;
21
+ if (!(0, util_1.hasNonNullValue)(error)) {
22
+ if (showLoadingOnNoModel) {
23
+ loading = !(0, util_1.hasNonNullValue)(model);
24
+ }
25
+ else {
26
+ loading = (0, rxjs_1.loadingStateIsLoading)(pair);
27
+ }
28
+ }
29
+ return {
30
+ loading,
31
+ error,
32
+ model
33
+ };
34
+ }
35
+ }
36
+ exports.LoadingStateLoadingContext = LoadingStateLoadingContext;
37
+ //# sourceMappingURL=loading.context.state.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.context.state.model.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.context.state.model.ts"],"names":[],"mappings":";;;AAAA,wCAAuD;AACvD,wCAAsD;AAEtD,8CAA0D;AAE1D,mEAAuH;AAUvH;;GAEG;AACH,MAAa,0BAAiF,SAAQ,0DAA0G;IAAhN;;QAEW,WAAM,GAAyB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,eAAG,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAA,uBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QACpF,sBAAiB,GAAyB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAM,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAA,eAAG,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAA,uBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;IAuBnI,CAAC;IArBW,0BAA0B,CAAC,IAAO,EAAE,EAAE,oBAAoB,KAAuC,EAAE;QAC3G,IAAI,OAAO,GAAY,KAAK,CAAC;QAE7B,MAAM,KAAK,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;QAE1B,IAAI,CAAC,IAAA,sBAAe,EAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,oBAAoB,EAAE;gBACxB,OAAO,GAAG,CAAC,IAAA,sBAAe,EAAC,KAAK,CAAC,CAAC;aACnC;iBAAM;gBACL,OAAO,GAAG,IAAA,4BAAqB,EAAC,IAAI,CAAC,CAAC;aACvC;SACF;QAED,OAAO;YACL,OAAO;YACP,KAAK;YACL,KAAK;SACN,CAAC;IACJ,CAAC;CAEF;AA1BD,gEA0BC"}
@@ -0,0 +1,21 @@
1
+ import { LimitArrayConfig, Maybe } from '@dereekb/util';
2
+ import { Observable } from 'rxjs';
3
+ import { LoadingContextEvent } from './loading.context';
4
+ import { PageListLoadingState } from './loading.state';
5
+ import { AbstractLoadingEventForLoadingPairConfig, AbstractLoadingStateLoadingContext } from './loading.context.state';
6
+ export interface PageListLoadingContextEvent<T> extends LoadingContextEvent {
7
+ list?: Maybe<T[]>;
8
+ }
9
+ export interface LoadingEventForPageListLoadingStateConfig<S extends PageListLoadingState<any> = PageListLoadingState<any>> extends AbstractLoadingEventForLoadingPairConfig<S>, Partial<LimitArrayConfig> {
10
+ }
11
+ /**
12
+ * LoadingContext implementation that uses a PageListLoadingState observable.
13
+ */
14
+ export declare class PageListLoadingContext<L = any, S extends PageListLoadingState<L> = PageListLoadingState<L>> extends AbstractLoadingStateLoadingContext<L[], S, PageListLoadingContextEvent<L>, LoadingEventForPageListLoadingStateConfig<S>> {
15
+ /**
16
+ * Returns the current models or an empty list.
17
+ */
18
+ readonly list$: Observable<L[]>;
19
+ readonly models$: Observable<L[]>;
20
+ protected loadingEventForLoadingPair(state: S, config?: LoadingEventForPageListLoadingStateConfig): PageListLoadingContextEvent<L>;
21
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PageListLoadingContext = void 0;
4
+ const rxjs_1 = require("@dereekb/rxjs");
5
+ const util_1 = require("@dereekb/util");
6
+ const operators_1 = require("rxjs/operators");
7
+ const loading_context_state_1 = require("./loading.context.state");
8
+ /**
9
+ * LoadingContext implementation that uses a PageListLoadingState observable.
10
+ */
11
+ class PageListLoadingContext extends loading_context_state_1.AbstractLoadingStateLoadingContext {
12
+ constructor() {
13
+ super(...arguments);
14
+ /**
15
+ * Returns the current models or an empty list.
16
+ */
17
+ this.list$ = this.stream$.pipe((0, operators_1.map)(x => { var _a; return (_a = x.list) !== null && _a !== void 0 ? _a : []; }), (0, operators_1.shareReplay)(1));
18
+ this.models$ = this.list$;
19
+ }
20
+ loadingEventForLoadingPair(state, config = {}) {
21
+ const { showLoadingOnNoModel } = config;
22
+ let loading = state === null || state === void 0 ? void 0 : state.loading;
23
+ const error = state === null || state === void 0 ? void 0 : state.error;
24
+ let list = state === null || state === void 0 ? void 0 : state.model;
25
+ const hasModel = list != null;
26
+ if (hasModel) {
27
+ list = (0, util_1.limitArray)(list, config); // Always limit the model/results.
28
+ }
29
+ // If there is no error
30
+ if (!(0, util_1.hasNonNullValue)(error)) {
31
+ if (showLoadingOnNoModel) {
32
+ loading = !hasModel;
33
+ }
34
+ else {
35
+ loading = (0, rxjs_1.loadingStateIsLoading)(state);
36
+ }
37
+ }
38
+ return {
39
+ loading: Boolean(loading),
40
+ error,
41
+ list
42
+ };
43
+ }
44
+ }
45
+ exports.PageListLoadingContext = PageListLoadingContext;
46
+ //# sourceMappingURL=loading.context.state.page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.context.state.page.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.context.state.page.ts"],"names":[],"mappings":";;;AAAA,wCAAsD;AACtD,wCAAqF;AAErF,8CAAkD;AAGlD,mEAAuH;AAQvH;;GAEG;AACH,MAAa,sBAA6F,SAAQ,0DAAwH;IAA1O;;QAEE;;WAEG;QACM,UAAK,GAAoB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,eAAG,EAAC,CAAC,CAAC,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,IAAI,mCAAI,EAAE,CAAA,EAAA,CAAC,EAAE,IAAA,uBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QACnF,YAAO,GAAoB,IAAI,CAAC,KAAK,CAAC;IA+BjD,CAAC;IA7BW,0BAA0B,CAAC,KAAQ,EAAE,SAAoD,EAAE;QACnG,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC;QAExC,IAAI,OAAO,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC;QAC3B,IAAI,IAAI,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC;QAE9B,IAAI,QAAQ,EAAE;YACZ,IAAI,GAAG,IAAA,iBAAU,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAE,kCAAkC;SACrE;QAED,uBAAuB;QACvB,IAAI,CAAC,IAAA,sBAAe,EAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,oBAAoB,EAAE;gBACxB,OAAO,GAAG,CAAC,QAAQ,CAAC;aACrB;iBAAM;gBACL,OAAO,GAAG,IAAA,4BAAqB,EAAC,KAAK,CAAC,CAAC;aACxC;SACF;QAED,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;YACzB,KAAK;YACL,IAAI;SACL,CAAC;IACJ,CAAC;CAEF;AArCD,wDAqCC"}
@@ -0,0 +1,19 @@
1
+ import { SimpleLoadingContext } from './loading.context.simple';
2
+ export declare type LoadingContextCheckCompletionFunction = () => any[];
3
+ export interface LoadingContextConfiguration {
4
+ loading?: boolean;
5
+ checkDone?: LoadingContextCheckCompletionFunction;
6
+ }
7
+ /**
8
+ * Utility object for maintaining a loading stream$. Is triggered into loading, then can be triggered again to see if elements have all completed loading or not.
9
+ */
10
+ export declare class ValuesLoadingContext extends SimpleLoadingContext {
11
+ private _checkDone?;
12
+ constructor({ checkDone, loading }?: LoadingContextConfiguration);
13
+ /**
14
+ * Check the array for objects to see if loading is completed.
15
+ *
16
+ * The loading state is always modified unless there is an error or no check function.
17
+ */
18
+ check(): void;
19
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValuesLoadingContext = void 0;
4
+ const loading_context_simple_1 = require("./loading.context.simple");
5
+ /**
6
+ * Utility object for maintaining a loading stream$. Is triggered into loading, then can be triggered again to see if elements have all completed loading or not.
7
+ */
8
+ class ValuesLoadingContext extends loading_context_simple_1.SimpleLoadingContext {
9
+ constructor({ checkDone, loading = true } = {}) {
10
+ super(loading);
11
+ this._checkDone = checkDone;
12
+ }
13
+ /**
14
+ * Check the array for objects to see if loading is completed.
15
+ *
16
+ * The loading state is always modified unless there is an error or no check function.
17
+ */
18
+ check() {
19
+ if (!this.hasError()) {
20
+ if (this._checkDone) {
21
+ const checkArray = this._checkDone();
22
+ let loading = true;
23
+ if (checkArray.length > 0) {
24
+ const checkResult = checkArray.filter((x) => x === undefined); // If any are undefined, still loading.
25
+ loading = (checkResult.length > 0);
26
+ }
27
+ this.setLoading(loading);
28
+ }
29
+ else {
30
+ throw new Error('Attempted to check without a check function set.');
31
+ }
32
+ }
33
+ }
34
+ }
35
+ exports.ValuesLoadingContext = ValuesLoadingContext;
36
+ //# sourceMappingURL=loading.context.value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.context.value.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.context.value.ts"],"names":[],"mappings":";;;AAAA,qEAAgE;AAShE;;GAEG;AACH,MAAa,oBAAqB,SAAQ,6CAAoB;IAI5D,YAAY,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,KAAkC,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,KAAK;QACV,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrC,IAAI,OAAO,GAAG,IAAI,CAAC;gBAEnB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzB,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAE,uCAAuC;oBACvG,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;iBACpC;gBAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aAC1B;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;aACrE;SACF;IACH,CAAC;CAEF;AAhCD,oDAgCC"}
@@ -0,0 +1,90 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Maybe, ReadableError, ReadableDataError, Page, FilteredPage, PageNumber } from '@dereekb/util';
3
+ /**
4
+ * A model/error pair used in loading situations.
5
+ */
6
+ export interface LoadingErrorPair {
7
+ /**
8
+ * Field used to denote whether or not the model is being loaded.
9
+ *
10
+ * Not being specified is considered not being loaded.
11
+ */
12
+ loading?: Maybe<boolean>;
13
+ /**
14
+ * A Readable server error.
15
+ */
16
+ error?: Maybe<ReadableError>;
17
+ }
18
+ /**
19
+ * A model/error pair used in loading situations.
20
+ */
21
+ export interface LoadingState<T = any> extends LoadingErrorPair {
22
+ model?: Maybe<T>;
23
+ }
24
+ /**
25
+ * LoadingState with a Page.
26
+ */
27
+ export interface PageLoadingState<T> extends LoadingState<T>, Page {
28
+ }
29
+ /**
30
+ * PageLoadingState with a filter.
31
+ */
32
+ export interface FilteredPageLoadingState<T, F> extends PageLoadingState<T>, FilteredPage<F> {
33
+ }
34
+ /**
35
+ * LoadingPageState that has an array of the model
36
+ */
37
+ export interface PageListLoadingState<T> extends PageLoadingState<T[]> {
38
+ }
39
+ /**
40
+ * PageListLoadingState with a Filter.
41
+ */
42
+ export interface FilteredPageListLoadingState<T, F> extends FilteredPageLoadingState<T[], F> {
43
+ }
44
+ export declare function beginLoading(): LoadingState<any>;
45
+ export declare function beginLoading<T>(): LoadingState<T>;
46
+ export declare function beginLoading<T>(state?: Partial<PageLoadingState<T>>): PageLoadingState<T>;
47
+ export declare function successResult<T>(model: T): LoadingState<T>;
48
+ export declare function successPageResult<T>(page: PageNumber, model: T): PageLoadingState<T>;
49
+ export declare function errorResult(error?: ReadableDataError): LoadingState<any>;
50
+ export declare function errorPageResult<T>(page: PageNumber, error?: ReadableDataError): PageLoadingState<T>;
51
+ export declare function anyLoadingStatesIsLoading(states: LoadingState[]): boolean;
52
+ export declare function allLoadingStatesHaveFinishedLoading(states: LoadingState[]): boolean;
53
+ export declare function loadingStateIsLoading(state: Maybe<LoadingState>): boolean;
54
+ export declare function loadingStateHasFinishedLoading(state: Maybe<LoadingState>): boolean;
55
+ export declare function loadingStateHasModel(state: Maybe<LoadingState>): boolean;
56
+ export declare function loadingStateHasError(state: Maybe<LoadingState>): boolean;
57
+ /**
58
+ * Wraps an observable output and maps the value to a LoadingState.
59
+ */
60
+ export declare function loadingStateFromObs<T>(obs: Observable<T>, firstOnly?: boolean): Observable<LoadingState<T>>;
61
+ export declare function combineLoadingStates<A, B>(obsA: Observable<LoadingState<A>>, obsB: Observable<LoadingState<B>>): Observable<LoadingState<A & B>>;
62
+ export declare function combineLoadingStates<A, B, C>(obsA: Observable<LoadingState<A>>, obsB: Observable<LoadingState<B>>, mergeFn?: (a: A, b: B) => C): Observable<LoadingState<C>>;
63
+ export declare function mergeLoadingStates<A, B>(a: LoadingState<A>, b: LoadingState<B>): LoadingState<A & B>;
64
+ export declare function mergeLoadingStates<A, B, C>(a: LoadingState<A>, b: LoadingState<B>, mergeFn: (a: A, b: B) => C): LoadingState<C>;
65
+ /**
66
+ * Updates the input state to start loading.
67
+ */
68
+ export declare function updatedStateForSetLoading<T, S extends LoadingState<T> = LoadingState<T>>(state: S, loading?: boolean): S;
69
+ /**
70
+ * Updates the input state with the input error.
71
+ */
72
+ export declare function updatedStateForSetModel<T, S extends LoadingState<T> = LoadingState<T>>(state: S, model: T | undefined): S;
73
+ /**
74
+ * Updates the input state with the input error.
75
+ */
76
+ export declare function updatedStateForSetError<T, S extends LoadingState<T> = LoadingState<T>>(state: S, error?: ReadableDataError): S;
77
+ export declare type MapMultipleLoadingStateValuesFn<T, X> = (input: X[]) => T;
78
+ export interface MapMultipleLoadingStateResultsConfiguration<T, X, L extends LoadingState<X>[], R extends LoadingState<T>> {
79
+ mapValues?: MapMultipleLoadingStateValuesFn<T, X>;
80
+ mapState?: (input: L) => R;
81
+ }
82
+ export declare function mapMultipleLoadingStateResults<T, X, L extends LoadingState<X>[], R extends LoadingState<T>>(input: L, config: MapMultipleLoadingStateResultsConfiguration<T, X, L, R>): Maybe<R>;
83
+ export declare type MapLoadingStateFn<A, B, L extends LoadingState<A> = LoadingState<A>, O extends LoadingState<B> = LoadingState<B>> = (input: L) => O;
84
+ export declare type MapLoadingStateValuesFn<A, B, L extends LoadingState<A> = LoadingState<A>> = (input: A, state: L) => B;
85
+ export interface MapLoadingStateResultsConfiguration<A, B, L extends LoadingState<A> = LoadingState<A>, O extends LoadingState<B> = LoadingState<B>> {
86
+ mapValue?: MapLoadingStateValuesFn<A, B, L>;
87
+ mapState?: MapLoadingStateFn<A, B, L, O>;
88
+ }
89
+ export declare function mapLoadingStateResults<A, B, L extends PageLoadingState<A> = PageLoadingState<A>, O extends PageLoadingState<B> = PageLoadingState<B>>(input: L, config: MapLoadingStateResultsConfiguration<A, B, L, O>): O;
90
+ export declare function mapLoadingStateResults<A, B, L extends LoadingState<A> = LoadingState<A>, O extends LoadingState<B> = LoadingState<B>>(input: L, config: MapLoadingStateResultsConfiguration<A, B, L, O>): O;
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapLoadingStateResults = exports.mapMultipleLoadingStateResults = exports.updatedStateForSetError = exports.updatedStateForSetModel = exports.updatedStateForSetLoading = exports.mergeLoadingStates = exports.combineLoadingStates = exports.loadingStateFromObs = exports.loadingStateHasError = exports.loadingStateHasModel = exports.loadingStateHasFinishedLoading = exports.loadingStateIsLoading = exports.allLoadingStatesHaveFinishedLoading = exports.anyLoadingStatesIsLoading = exports.errorPageResult = exports.errorResult = exports.successPageResult = exports.successResult = exports.beginLoading = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const util_1 = require("@dereekb/util");
7
+ function beginLoading(state) {
8
+ return Object.assign(Object.assign({}, state), { loading: true });
9
+ }
10
+ exports.beginLoading = beginLoading;
11
+ function successResult(model) {
12
+ return { model, loading: false };
13
+ }
14
+ exports.successResult = successResult;
15
+ function successPageResult(page, model) {
16
+ return Object.assign(Object.assign({}, successResult(model)), { page });
17
+ }
18
+ exports.successPageResult = successPageResult;
19
+ function errorResult(error) {
20
+ return { error, loading: false };
21
+ }
22
+ exports.errorResult = errorResult;
23
+ function errorPageResult(page, error) {
24
+ return Object.assign(Object.assign({}, errorResult(error)), { page });
25
+ }
26
+ exports.errorPageResult = errorPageResult;
27
+ function anyLoadingStatesIsLoading(states) {
28
+ return (0, util_1.reduceBooleansWithOr)(states.map(loadingStateIsLoading), false);
29
+ }
30
+ exports.anyLoadingStatesIsLoading = anyLoadingStatesIsLoading;
31
+ function allLoadingStatesHaveFinishedLoading(states) {
32
+ return (0, util_1.reduceBooleansWithAnd)(states.map(loadingStateHasFinishedLoading), true);
33
+ }
34
+ exports.allLoadingStatesHaveFinishedLoading = allLoadingStatesHaveFinishedLoading;
35
+ function loadingStateIsLoading(state) {
36
+ var _a;
37
+ if (state) {
38
+ return (_a = state.loading) !== null && _a !== void 0 ? _a : !Boolean(state.model || state.error);
39
+ }
40
+ else {
41
+ return false;
42
+ }
43
+ }
44
+ exports.loadingStateIsLoading = loadingStateIsLoading;
45
+ function loadingStateHasFinishedLoading(state) {
46
+ if (state) {
47
+ return state.loading === false || Boolean(state.model || state.error);
48
+ }
49
+ else {
50
+ return false;
51
+ }
52
+ }
53
+ exports.loadingStateHasFinishedLoading = loadingStateHasFinishedLoading;
54
+ function loadingStateHasModel(state) {
55
+ if (state) {
56
+ return loadingStateHasFinishedLoading(state) && state.model != null;
57
+ }
58
+ else {
59
+ return false;
60
+ }
61
+ }
62
+ exports.loadingStateHasModel = loadingStateHasModel;
63
+ function loadingStateHasError(state) {
64
+ if (state) {
65
+ return loadingStateHasFinishedLoading(state) && state.error != null;
66
+ }
67
+ else {
68
+ return false;
69
+ }
70
+ }
71
+ exports.loadingStateHasError = loadingStateHasError;
72
+ /**
73
+ * Wraps an observable output and maps the value to a LoadingState.
74
+ */
75
+ function loadingStateFromObs(obs, firstOnly) {
76
+ if (firstOnly) {
77
+ obs = obs.pipe((0, operators_1.first)());
78
+ }
79
+ return obs.pipe((0, operators_1.map)((model) => ({ loading: false, model, error: undefined })), (0, operators_1.catchError)((error) => (0, rxjs_1.of)({ loading: false, error })), (0, operators_1.delay)(50), (0, operators_1.startWith)(({ loading: true })));
80
+ }
81
+ exports.loadingStateFromObs = loadingStateFromObs;
82
+ /**
83
+ * Convenience function for creating a pipe that merges the two input observables.
84
+ */
85
+ function combineLoadingStates(obsA, obsB, mergeFn) {
86
+ return (0, rxjs_1.combineLatest)([obsA, obsB])
87
+ .pipe((0, operators_1.distinctUntilChanged)((x, y) => (x === null || x === void 0 ? void 0 : x[0]) === (y === null || y === void 0 ? void 0 : y[0]) && (x === null || x === void 0 ? void 0 : x[1]) === (y === null || y === void 0 ? void 0 : y[1])), // Prevent remerging the same values!
88
+ (0, operators_1.map)(([a, b]) => mergeLoadingStates(a, b, mergeFn)), (0, operators_1.shareReplay)(1) // Share the result.
89
+ );
90
+ }
91
+ exports.combineLoadingStates = combineLoadingStates;
92
+ /**
93
+ * Merges the input loading states.
94
+ *
95
+ * If one is unavailable, it is considered loading.
96
+ * If one is loading, will return the loading state.
97
+ * If one has an error and is not loading, will return the error with loading false.
98
+ */
99
+ function mergeLoadingStates(a, b, mergeFn = (aa, bb) => (Object.assign(Object.assign({}, aa), bb))) {
100
+ var _a, _b;
101
+ const error = (_a = a === null || a === void 0 ? void 0 : a.error) !== null && _a !== void 0 ? _a : b === null || b === void 0 ? void 0 : b.error;
102
+ let result;
103
+ if (error) {
104
+ result = {
105
+ // Evaluate both for the loading state.
106
+ loading: (a === null || a === void 0 ? void 0 : a.error) ? a.loading : false || (b === null || b === void 0 ? void 0 : b.error) ? b.loading : false,
107
+ error
108
+ };
109
+ }
110
+ else {
111
+ const loading = (!a || !b) || ((_b = a === null || a === void 0 ? void 0 : a.loading) !== null && _b !== void 0 ? _b : b === null || b === void 0 ? void 0 : b.loading);
112
+ if (loading) {
113
+ result = {
114
+ loading: true
115
+ };
116
+ }
117
+ else {
118
+ result = {
119
+ loading: false,
120
+ model: mergeFn(a.model, b.model)
121
+ };
122
+ }
123
+ }
124
+ return result;
125
+ }
126
+ exports.mergeLoadingStates = mergeLoadingStates;
127
+ /**
128
+ * Updates the input state to start loading.
129
+ */
130
+ function updatedStateForSetLoading(state, loading = true) {
131
+ return Object.assign(Object.assign({}, state), { model: undefined, loading, error: undefined });
132
+ }
133
+ exports.updatedStateForSetLoading = updatedStateForSetLoading;
134
+ /**
135
+ * Updates the input state with the input error.
136
+ */
137
+ function updatedStateForSetModel(state, model) {
138
+ return Object.assign(Object.assign({}, state), { model: model !== null && model !== void 0 ? model : undefined, loading: false, error: undefined });
139
+ }
140
+ exports.updatedStateForSetModel = updatedStateForSetModel;
141
+ /**
142
+ * Updates the input state with the input error.
143
+ */
144
+ function updatedStateForSetError(state, error) {
145
+ return Object.assign(Object.assign({}, state), { loading: false, error });
146
+ }
147
+ exports.updatedStateForSetError = updatedStateForSetError;
148
+ function mapMultipleLoadingStateResults(input, config) {
149
+ const { mapValues, mapState } = config;
150
+ const loading = anyLoadingStatesIsLoading(input);
151
+ const error = input.map(x => x === null || x === void 0 ? void 0 : x.error).filter(x => Boolean(x))[0];
152
+ let result;
153
+ if (!error && !loading) {
154
+ if (mapValues) {
155
+ const model = mapValues(input.map(x => x.model));
156
+ result = {
157
+ loading,
158
+ model,
159
+ error
160
+ };
161
+ }
162
+ else if (mapState) {
163
+ result = mapState(input);
164
+ }
165
+ else {
166
+ throw new Error('Incomplete mapMultipleLoadingStateResults configuration');
167
+ }
168
+ }
169
+ return result;
170
+ }
171
+ exports.mapMultipleLoadingStateResults = mapMultipleLoadingStateResults;
172
+ function mapLoadingStateResults(input, config) {
173
+ const { mapValue, mapState } = config;
174
+ let model = input === null || input === void 0 ? void 0 : input.model;
175
+ if (model != null && mapValue) {
176
+ model = mapValue(model, input);
177
+ }
178
+ let result;
179
+ if (!mapState) {
180
+ result = Object.assign(Object.assign({}, input), { model });
181
+ }
182
+ else {
183
+ result = mapState(input);
184
+ }
185
+ return result;
186
+ }
187
+ exports.mapLoadingStateResults = mapLoadingStateResults;
188
+ //# sourceMappingURL=loading.state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.state.js","sourceRoot":"","sources":["../../../../../../packages/rxjs/src/lib/loading/loading.state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Observable, Subscription } from 'rxjs';
2
+ export declare type LockKey = string;
3
+ export declare type OnLockSetUnlockedFunction = (unlocked: boolean) => void;
4
+ export interface OnLockSetUnlockedConfig {
5
+ lockSet: LockSet;
6
+ fn: OnLockSetUnlockedFunction;
7
+ timeout?: number;
8
+ delayTime?: number;
9
+ }
10
+ export interface SetLockedConfig {
11
+ /**
12
+ * Whether or not to lock the config.
13
+ */
14
+ locked?: boolean;
15
+ /**
16
+ * Optional duration to set the locked state.
17
+ *
18
+ * Only relevant for locking.
19
+ */
20
+ duration?: number;
21
+ }
22
+ export declare const DEFAULT_LOCK_SET_TIME_LOCK_KEY = "timelock";
23
+ /**
24
+ * Executes the input function when the lockSet is set unlocked, or the timeout is reached.
25
+ */
26
+ export declare function onLockSetNextUnlock({ lockSet, fn, timeout, delayTime }: OnLockSetUnlockedConfig): Subscription;
27
+ /**
28
+ * Used for preventing an action until all keys are removed.
29
+ *
30
+ * Added Observables do not need to be strictly removed; empty observables are counted as unlocked.
31
+ */
32
+ export declare class LockSet {
33
+ private static LOCK_SET_CHILD_INDEX_STEPPER;
34
+ private _locks;
35
+ readonly locks$: Observable<Map<string, Observable<boolean>>>;
36
+ /**
37
+ * isLocked$ is true if any observable is emitting true.
38
+ */
39
+ readonly isLocked$: Observable<boolean>;
40
+ readonly isUnlocked$: Observable<boolean>;
41
+ constructor();
42
+ private get locks();
43
+ setLocked(key: LockKey, config: SetLockedConfig): void;
44
+ setLocked(key: LockKey, config: boolean, duration?: number): void;
45
+ lockForSeconds(seconds: number): void;
46
+ lockForTime(milliseconds: number, key?: LockKey): void;
47
+ addLock(key: LockKey, obs: Observable<boolean>): void;
48
+ removeLock(key: LockKey): void;
49
+ onNextUnlock(config: OnLockSetUnlockedFunction | Omit<OnLockSetUnlockedConfig, 'lockSet'>, delayTime?: number): Subscription;
50
+ /**
51
+ * Convenience function for watching a child lockset's locked state.
52
+ */
53
+ addChildLockSet(lockSet: LockSet, key?: LockKey): void;
54
+ destroyOnNextUnlock(config?: OnLockSetUnlockedFunction | Omit<OnLockSetUnlockedConfig, 'lockSet'>, delayTime?: number): void;
55
+ destroy(): void;
56
+ }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LockSet = exports.onLockSetNextUnlock = exports.DEFAULT_LOCK_SET_TIME_LOCK_KEY = void 0;
4
+ const operators_1 = require("rxjs/operators");
5
+ const rxjs_1 = require("rxjs");
6
+ const rxjs_2 = require("rxjs");
7
+ const rxjs_3 = require("./rxjs");
8
+ const util_1 = require("@dereekb/util");
9
+ const ms_1 = require("ms");
10
+ exports.DEFAULT_LOCK_SET_TIME_LOCK_KEY = 'timelock';
11
+ /**
12
+ * Executes the input function when the lockSet is set unlocked, or the timeout is reached.
13
+ */
14
+ function onLockSetNextUnlock({ lockSet, fn, timeout = (0, ms_1.default)('50s'), delayTime }) {
15
+ return lockSet.isUnlocked$.pipe((0, operators_1.filter)((x) => x), (0, operators_1.delay)(delayTime !== null && delayTime !== void 0 ? delayTime : 0), (0, operators_1.timeoutWith)(timeout, (0, rxjs_1.of)(false).pipe((0, operators_1.tap)(() => console.warn('LockSet time out. Potential issue detected.')))), (0, operators_1.first)()).subscribe(fn);
16
+ }
17
+ exports.onLockSetNextUnlock = onLockSetNextUnlock;
18
+ /**
19
+ * Used for preventing an action until all keys are removed.
20
+ *
21
+ * Added Observables do not need to be strictly removed; empty observables are counted as unlocked.
22
+ */
23
+ class LockSet {
24
+ constructor() {
25
+ this._locks = new rxjs_2.BehaviorSubject(new Map());
26
+ this.locks$ = this._locks.asObservable();
27
+ /**
28
+ * isLocked$ is true if any observable is emitting true.
29
+ */
30
+ this.isLocked$ = this.locks$.pipe((0, operators_1.switchMap)((0, rxjs_3.combineLatestFromMapValuesObsFn)((x) => x)), (0, operators_1.map)((0, util_1.reduceBooleansWithOrFn)(false)), // Empty map is unlocked.
31
+ (0, operators_1.shareReplay)(1));
32
+ this.isUnlocked$ = this.isLocked$.pipe((0, operators_1.map)(x => !x));
33
+ }
34
+ get locks() {
35
+ return this._locks.value;
36
+ }
37
+ setLocked(key, config, duration) {
38
+ var _a;
39
+ let lockedConfig;
40
+ if (typeof config !== 'object') {
41
+ lockedConfig = config;
42
+ }
43
+ else {
44
+ lockedConfig = {
45
+ locked: (_a = config) !== null && _a !== void 0 ? _a : true,
46
+ duration
47
+ };
48
+ }
49
+ if (lockedConfig.locked) {
50
+ let obs = (0, rxjs_1.of)(true);
51
+ if (lockedConfig.duration) {
52
+ obs = obs.pipe((0, operators_1.timeoutWith)(lockedConfig.duration, (0, rxjs_1.of)(false)));
53
+ }
54
+ this.addLock(key, obs);
55
+ }
56
+ else {
57
+ this.removeLock(key);
58
+ }
59
+ }
60
+ lockForSeconds(seconds) {
61
+ this.lockForTime(seconds * 1000);
62
+ }
63
+ lockForTime(milliseconds, key) {
64
+ this.addLock(key !== null && key !== void 0 ? key : exports.DEFAULT_LOCK_SET_TIME_LOCK_KEY, (0, rxjs_1.of)(false).pipe((0, operators_1.delay)(milliseconds), (0, operators_1.startWith)(true)));
65
+ }
66
+ addLock(key, obs) {
67
+ obs = obs.pipe((0, operators_1.defaultIfEmpty)(false)); // empty observables count as unlocked.
68
+ this._locks.value.set(key, obs);
69
+ this._locks.next(this.locks);
70
+ }
71
+ removeLock(key) {
72
+ if (this._locks.value.delete(key)) {
73
+ this._locks.next(this.locks);
74
+ }
75
+ }
76
+ onNextUnlock(config, delayTime) {
77
+ return onLockSetNextUnlock(Object.assign({ lockSet: this, delayTime }, ((typeof config === 'function') ? { fn: config } : config)));
78
+ }
79
+ /**
80
+ * Convenience function for watching a child lockset's locked state.
81
+ */
82
+ addChildLockSet(lockSet, key = `${LockSet.LOCK_SET_CHILD_INDEX_STEPPER++}`) {
83
+ this.addLock(key, lockSet.isLocked$);
84
+ }
85
+ // Cleanup
86
+ destroyOnNextUnlock(config, delayTime) {
87
+ let fn;
88
+ let mergeConfig;
89
+ if (config) {
90
+ if (typeof config === 'function') {
91
+ fn = config;
92
+ }
93
+ else {
94
+ fn = config.fn;
95
+ mergeConfig = config;
96
+ }
97
+ }
98
+ this.onNextUnlock(Object.assign(Object.assign({}, mergeConfig), { fn: (unlocked) => {
99
+ fn === null || fn === void 0 ? void 0 : fn(unlocked);
100
+ setTimeout(() => this.destroy(), 100);
101
+ }, delayTime }));
102
+ }
103
+ destroy() {
104
+ this._locks.complete();
105
+ }
106
+ }
107
+ exports.LockSet = LockSet;
108
+ LockSet.LOCK_SET_CHILD_INDEX_STEPPER = 0;
109
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../../../packages/rxjs/src/lib/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { MonoTypeOperatorFunction, Observable } from "rxjs";
2
+ /**
3
+ * Equivalent to distinctUntilChanged() using isEqualObject()
4
+ */
5
+ export declare function distinctUntilObjectValuesChanged<T>(): MonoTypeOperatorFunction<T>;
6
+ /**
7
+ * Observable filter that filters the input if the object is unchanged/equal to the input.
8
+ */
9
+ export declare function filterIfObjectValuesUnchanged<F>(inputFilter: F): MonoTypeOperatorFunction<F>;
10
+ export declare function filterIfObjectValuesUnchanged<F>(obs: Observable<F>): MonoTypeOperatorFunction<F>;