@fozy-labs/rx-toolkit 0.4.18 → 0.5.0-rc.0
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.
- package/README.md +20 -19
- package/dist/common/devtools/reduxDevtools.d.ts +17 -0
- package/dist/common/devtools/reduxDevtools.js +98 -17
- package/dist/common/devtools/types.d.ts +1 -0
- package/dist/common/options/DefaultOptions.d.ts +0 -2
- package/dist/common/options/DefaultOptions.js +0 -2
- package/dist/common/options/SharedOptions.d.ts +0 -2
- package/dist/common/options/SharedOptions.js +0 -1
- package/dist/query/api/resetAllQueriesCache.d.ts +1 -0
- package/dist/query/api/resetAllQueriesCache.js +4 -0
- package/dist/query/core/Opertation/Operation.js +10 -7
- package/dist/query/core/Opertation/OperationAgent.d.ts +0 -2
- package/dist/query/core/Opertation/OperationAgent.js +4 -21
- package/dist/query/core/QueriesCache.d.ts +1 -1
- package/dist/query/core/QueriesCache.js +2 -6
- package/dist/query/core/{CleanAllQueriesSignal.d.ts → ResetAllQueriesSignal.d.ts} +1 -1
- package/dist/query/core/ResetAllQueriesSignal.js +11 -0
- package/dist/query/core/Resource/Resource.js +7 -3
- package/dist/query/core/Resource/ResourceAgent.d.ts +2 -3
- package/dist/query/core/Resource/ResourceAgent.js +62 -29
- package/dist/query/index.d.ts +1 -1
- package/dist/query/index.js +1 -1
- package/dist/query/lib/IndirectMap.d.ts +1 -1
- package/dist/query/lib/IndirectMap.js +1 -1
- package/dist/query/lib/ReactiveCache.d.ts +1 -1
- package/dist/query/lib/ReactiveCache.js +2 -2
- package/dist/query/react/useOperationAgent.js +2 -5
- package/dist/query/react/useResourceAgent.js +1 -4
- package/dist/query/types/Operation.types.d.ts +1 -3
- package/dist/query/types/Resource.types.d.ts +1 -3
- package/dist/signals/base/Batcher.d.ts +1 -1
- package/dist/signals/base/Batcher.js +1 -1
- package/dist/signals/base/DependencyTracker.d.ts +18 -0
- package/dist/signals/base/DependencyTracker.js +13 -0
- package/dist/signals/base/Devtools.d.ts +1 -1
- package/dist/signals/base/Devtools.js +13 -1
- package/dist/signals/base/ReadonlySignal.d.ts +5 -7
- package/dist/signals/base/ReadonlySignal.js +20 -12
- package/dist/signals/base/index.d.ts +1 -2
- package/dist/signals/base/index.js +1 -2
- package/dist/signals/operators/index.d.ts +0 -2
- package/dist/signals/operators/index.js +0 -2
- package/dist/signals/operators/signalize.d.ts +2 -2
- package/dist/signals/operators/signalize.js +1 -1
- package/dist/signals/react/useSignal.d.ts +6 -2
- package/dist/signals/react/useSignal.js +2 -21
- package/dist/signals/signals/Computed.d.ts +13 -11
- package/dist/signals/signals/Computed.js +79 -26
- package/dist/signals/signals/Effect.d.ts +11 -7
- package/dist/signals/signals/Effect.js +60 -58
- package/dist/signals/signals/LocalSignal.d.ts +14 -7
- package/dist/signals/signals/LocalSignal.js +52 -33
- package/dist/signals/signals/Signal.d.ts +13 -37
- package/dist/signals/signals/Signal.js +44 -58
- package/dist/signals/types/index.d.ts +1 -0
- package/dist/signals/types/index.js +1 -0
- package/dist/signals/types/signals.types.d.ts +16 -0
- package/docs/CHANGELOG.md +32 -0
- package/docs/devtools/README.md +162 -29
- package/docs/migrations/0.5.0.md +73 -0
- package/docs/options/README.md +89 -0
- package/docs/query/README.md +425 -89
- package/docs/release/README.md +58 -6
- package/docs/signals/README.md +207 -34
- package/docs/usage/react/README.md +261 -49
- package/package.json +1 -1
- package/dist/query/api/cleanAllQueriesCache.d.ts +0 -1
- package/dist/query/api/cleanAllQueriesCache.js +0 -4
- package/dist/query/core/CleanAllQueriesSignal.js +0 -11
- package/dist/signals/base/Tracker.d.ts +0 -10
- package/dist/signals/base/Tracker.js +0 -7
- package/dist/signals/base/types.d.ts +0 -23
- package/dist/signals/operators/filterUpdates.d.ts +0 -5
- package/dist/signals/operators/filterUpdates.js +0 -18
- package/dist/signals/operators/mapSignals.d.ts +0 -3
- package/dist/signals/operators/mapSignals.js +0 -10
- /package/dist/signals/{base/types.js → types/signals.types.js} +0 -0
package/dist/query/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './api/createResource';
|
|
2
2
|
export * from './api/createOperation';
|
|
3
|
-
export * from './api/
|
|
3
|
+
export * from './api/resetAllQueriesCache';
|
|
4
4
|
export * from './SKIP_TOKEN';
|
|
5
5
|
export * from './react/useResourceAgent';
|
|
6
6
|
export * from './react/useResourceRef';
|
package/dist/query/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './api/createResource';
|
|
2
2
|
export * from './api/createOperation';
|
|
3
|
-
export * from './api/
|
|
3
|
+
export * from './api/resetAllQueriesCache';
|
|
4
4
|
export * from './SKIP_TOKEN';
|
|
5
5
|
export * from './react/useResourceAgent';
|
|
6
6
|
export * from './react/useResourceRef';
|
|
@@ -56,7 +56,7 @@ export class ReactiveCache {
|
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
get value() {
|
|
59
|
-
return this._state$.
|
|
59
|
+
return this._state$.getValue();
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
62
|
* Устанавливает новое значение в кэш и обновляет поток состояния.
|
|
@@ -74,7 +74,7 @@ export class ReactiveCache {
|
|
|
74
74
|
return;
|
|
75
75
|
this.closed = true;
|
|
76
76
|
this._state$.complete();
|
|
77
|
-
this.onClean$.next(this._state$.
|
|
77
|
+
this.onClean$.next(this._state$.getValue());
|
|
78
78
|
this.onClean$.complete();
|
|
79
79
|
}
|
|
80
80
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useConstant, useEventHandler
|
|
1
|
+
import { useConstant, useEventHandler } from "../../common/react";
|
|
2
2
|
import { useSignal } from "../../signals/react";
|
|
3
3
|
export function useOperationAgent(op) {
|
|
4
4
|
const agent = useConstant(() => op.createAgent());
|
|
@@ -6,7 +6,7 @@ export function useOperationAgent(op) {
|
|
|
6
6
|
const trigger = useEventHandler((args) => {
|
|
7
7
|
agent.initiate(args);
|
|
8
8
|
return new Promise((resolve, reject) => {
|
|
9
|
-
const sub = agent.state$.subscribe((s) => {
|
|
9
|
+
const sub = agent.state$.obs.subscribe((s) => {
|
|
10
10
|
if (s.isDone && !s.isLoading) {
|
|
11
11
|
sub.unsubscribe();
|
|
12
12
|
if (s.isSuccess) {
|
|
@@ -19,8 +19,5 @@ export function useOperationAgent(op) {
|
|
|
19
19
|
});
|
|
20
20
|
});
|
|
21
21
|
});
|
|
22
|
-
useUnmount(() => {
|
|
23
|
-
agent.complete();
|
|
24
|
-
}, [agent]);
|
|
25
22
|
return [trigger, state];
|
|
26
23
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { useConstant
|
|
2
|
+
import { useConstant } from "../../common/react";
|
|
3
3
|
import { useSignal } from "../../signals/react";
|
|
4
4
|
import { SKIP } from "../../query/SKIP_TOKEN";
|
|
5
5
|
export function useResourceAgent(res, ...argss) {
|
|
@@ -16,8 +16,5 @@ export function useResourceAgent(res, ...argss) {
|
|
|
16
16
|
prevArgsRef.current = args;
|
|
17
17
|
agent.initiate(args);
|
|
18
18
|
}
|
|
19
|
-
useUnmount(() => {
|
|
20
|
-
agent.complete();
|
|
21
|
-
});
|
|
22
19
|
return useSignal(agent.state$);
|
|
23
20
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReadableSignalLike } from "../../signals";
|
|
1
|
+
import { ReadableSignalLike } from "../../signals/types";
|
|
2
2
|
import { FallbackOnNever, OnCacheEntryAdded, OnQueryStarted } from "./shared.types";
|
|
3
3
|
import { ResourceDefinition, ResourceInstance } from "./Resource.types";
|
|
4
4
|
/**
|
|
@@ -132,8 +132,6 @@ export type OperationAgentInstanse<D extends OperationDefinition> = {
|
|
|
132
132
|
initiate(args: D["Args"]): void;
|
|
133
133
|
/** Создает новый агент операции */
|
|
134
134
|
createAgent(): OperationAgentInstanse<D>;
|
|
135
|
-
/** Завершает все текущие выполнения операции и очищает ресурсы */
|
|
136
|
-
complete(): void;
|
|
137
135
|
};
|
|
138
136
|
/**
|
|
139
137
|
* Состояние выполнения операции
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Patch as ImmerPatch } from "immer";
|
|
2
|
-
import { ReadableSignalLike } from "../../signals";
|
|
2
|
+
import { ReadableSignalLike } from "../../signals/types";
|
|
3
3
|
import { FallbackOnNever, OnCacheEntryAdded, OnQueryStarted } from "./shared.types";
|
|
4
4
|
/**
|
|
5
5
|
* Функция создания ресурса
|
|
@@ -71,8 +71,6 @@ export type ResourceAgentInstance<D extends ResourceDefinition> = {
|
|
|
71
71
|
state$: ReadableSignalLike<ResourceQueryState<D>>;
|
|
72
72
|
/** Инициирует запрос с указанными аргументами */
|
|
73
73
|
initiate(args: D["Args"], force?: boolean): void;
|
|
74
|
-
/** Завершает работу агента, позволяя освободить ресурсы */
|
|
75
|
-
complete(): void;
|
|
76
74
|
/** Сравнивает аргументы между собой */
|
|
77
75
|
compareArgs(args1: D["Args"], args2: D["Args"]): unknown;
|
|
78
76
|
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Observable } from "rxjs";
|
|
2
|
+
export type DependencyRecord = {
|
|
3
|
+
/**
|
|
4
|
+
* Правило: getRang() должен вызываться только ПОСЛЕ подписки на obs,
|
|
5
|
+
* чтобы гарантировать корректный порядок рангов при ленивой инициализации.
|
|
6
|
+
*/
|
|
7
|
+
getRang(): number;
|
|
8
|
+
obs: Observable<unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Зарезервировано для отладки и логирования.
|
|
11
|
+
*/
|
|
12
|
+
meta?: any;
|
|
13
|
+
};
|
|
14
|
+
export declare class DependencyTracker {
|
|
15
|
+
private static _currentHandler;
|
|
16
|
+
static track(dep: DependencyRecord): void;
|
|
17
|
+
static start(handler: (arg: DependencyRecord) => void): () => void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class DependencyTracker {
|
|
2
|
+
static _currentHandler = null;
|
|
3
|
+
static track(dep) {
|
|
4
|
+
this._currentHandler?.(dep);
|
|
5
|
+
}
|
|
6
|
+
static start(handler) {
|
|
7
|
+
let prevHandler = this._currentHandler;
|
|
8
|
+
this._currentHandler = handler;
|
|
9
|
+
return () => {
|
|
10
|
+
this._currentHandler = prevHandler;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StateDevtoolsOptions } from "../../common/devtools";
|
|
2
2
|
export declare const Devtools: {
|
|
3
|
-
createState<T>(initialValue: T, optionsDry?: StateDevtoolsOptions):
|
|
3
|
+
createState<T>(initialValue: T, optionsDry?: StateDevtoolsOptions): ((newState: T) => void) | null;
|
|
4
4
|
readonly hasDevtools: boolean;
|
|
5
5
|
};
|
|
@@ -11,7 +11,19 @@ export const Devtools = {
|
|
|
11
11
|
if (!createStateDevtools)
|
|
12
12
|
return null;
|
|
13
13
|
const key = createKey(options.name, options.base);
|
|
14
|
-
|
|
14
|
+
let stateDevtools = options._skipValues?.includes(initialValue)
|
|
15
|
+
? null
|
|
16
|
+
: createStateDevtools(key, initialValue);
|
|
17
|
+
return (newState) => {
|
|
18
|
+
if (options._skipValues?.includes(newState)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!stateDevtools) {
|
|
22
|
+
stateDevtools = createStateDevtools(key, newState);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
stateDevtools(newState);
|
|
26
|
+
};
|
|
15
27
|
},
|
|
16
28
|
get hasDevtools() {
|
|
17
29
|
return !!SharedOptions.DEVTOOLS?.state;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { Observable, Subscriber, TeardownLogic } from "rxjs";
|
|
2
|
-
import
|
|
2
|
+
import { ReadableSignalFnLike, ReadableSignalLike } from "../../signals/types";
|
|
3
3
|
import { SyncObservable } from "./SyncObservable";
|
|
4
|
-
export declare class ReadonlySignal<T>
|
|
4
|
+
export declare class ReadonlySignal<T> implements ReadableSignalLike<T> {
|
|
5
5
|
protected rang: number;
|
|
6
|
+
readonly obs: SyncObservable<T>;
|
|
6
7
|
constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic);
|
|
7
|
-
get value(): T;
|
|
8
|
-
peek(): T;
|
|
9
|
-
/**
|
|
10
|
-
* @deprecated
|
|
11
|
-
*/
|
|
12
8
|
get(): T;
|
|
9
|
+
peek(): T;
|
|
10
|
+
static create<T>(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic): ReadableSignalFnLike<T>;
|
|
13
11
|
}
|
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
import { SyncObservable } from "./SyncObservable";
|
|
2
|
-
import {
|
|
3
|
-
export class ReadonlySignal
|
|
2
|
+
import { DependencyTracker } from "./DependencyTracker";
|
|
3
|
+
export class ReadonlySignal {
|
|
4
4
|
rang = 0;
|
|
5
|
+
obs;
|
|
5
6
|
constructor(subscribe) {
|
|
6
|
-
|
|
7
|
+
this.obs = new SyncObservable(subscribe);
|
|
7
8
|
}
|
|
8
|
-
get
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
get() {
|
|
10
|
+
DependencyTracker.track({
|
|
11
|
+
getRang: () => this.rang,
|
|
12
|
+
obs: this.obs,
|
|
13
|
+
});
|
|
14
|
+
return this.obs.value;
|
|
11
15
|
}
|
|
12
16
|
peek() {
|
|
13
|
-
return
|
|
17
|
+
return this.obs.value;
|
|
14
18
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
static create(subscribe) {
|
|
20
|
+
const signal = new ReadonlySignal(subscribe);
|
|
21
|
+
function readonlySignalFn() {
|
|
22
|
+
return signal.get();
|
|
23
|
+
}
|
|
24
|
+
readonlySignalFn.obs = signal.obs;
|
|
25
|
+
readonlySignalFn.peek = () => signal.peek();
|
|
26
|
+
readonlySignalFn.get = () => signal.get();
|
|
27
|
+
return readonlySignalFn;
|
|
20
28
|
}
|
|
21
29
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Observable } from "rxjs";
|
|
2
|
-
import {
|
|
3
|
-
export declare function signalize<T>(observable: Observable<T>):
|
|
2
|
+
import { ReadableSignalFnLike } from "../../signals/types";
|
|
3
|
+
export declare function signalize<T>(observable: Observable<T>): ReadableSignalFnLike<T>;
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Observable } from "rxjs";
|
|
2
|
+
type SignalLike<T> = {
|
|
3
|
+
obs: Observable<T>;
|
|
4
|
+
};
|
|
5
|
+
export declare function useSignal<T>(signal$: SignalLike<T>): T;
|
|
6
|
+
export {};
|
|
@@ -1,23 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { useEventHandler } from "../../common/react";
|
|
1
|
+
import { useSyncObservable } from "../../common/react";
|
|
3
2
|
export function useSignal(signal$) {
|
|
4
|
-
|
|
5
|
-
const subscribe = React.useCallback((update) => {
|
|
6
|
-
const subscription = signal$.subscribe(() => {
|
|
7
|
-
doUpdateRef.current = true;
|
|
8
|
-
queueMicrotask(() => {
|
|
9
|
-
if (!doUpdateRef.current)
|
|
10
|
-
return;
|
|
11
|
-
update();
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
return () => {
|
|
15
|
-
subscription.unsubscribe();
|
|
16
|
-
};
|
|
17
|
-
}, [signal$]);
|
|
18
|
-
const getSnapshot = useEventHandler(() => {
|
|
19
|
-
doUpdateRef.current = false;
|
|
20
|
-
return signal$.peek();
|
|
21
|
-
});
|
|
22
|
-
return React.useSyncExternalStore(subscribe, getSnapshot);
|
|
3
|
+
return useSyncObservable(signal$.obs);
|
|
23
4
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { SubscriptionLike } from "rxjs";
|
|
2
|
-
import { ReadableSignalLike } from "../base";
|
|
3
|
-
import { Signal } from "./Signal";
|
|
4
1
|
import { StateDevtoolsOptions } from "../../common/devtools";
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { ComputeFn } from "../../signals/types";
|
|
3
|
+
export declare class Computed<T> {
|
|
4
|
+
private _computeFn;
|
|
5
|
+
private options?;
|
|
6
|
+
private _ls;
|
|
7
|
+
readonly obs: import("rxjs").Observable<T>;
|
|
7
8
|
private _effect;
|
|
8
|
-
constructor(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
constructor(_computeFn: () => T, options?: StateDevtoolsOptions | undefined);
|
|
10
|
+
get(): T;
|
|
11
|
+
peek(): T;
|
|
12
|
+
private _start;
|
|
13
|
+
private _stop;
|
|
14
|
+
private static _EMPTY;
|
|
15
|
+
static create<T>(computeFn: () => T, options?: StateDevtoolsOptions): ComputeFn<T>;
|
|
14
16
|
}
|
|
@@ -1,36 +1,89 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { distinctUntilChanged, ReplaySubject, share, map, finalize } from "rxjs";
|
|
2
|
+
import { DependencyTracker, Signal } from "../../signals";
|
|
2
3
|
import { Effect } from "./Effect";
|
|
3
|
-
export class Computed
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
export class Computed {
|
|
5
|
+
_computeFn;
|
|
6
|
+
options;
|
|
7
|
+
_ls;
|
|
8
|
+
obs;
|
|
9
|
+
_effect = null;
|
|
10
|
+
constructor(_computeFn, options) {
|
|
11
|
+
this._computeFn = _computeFn;
|
|
12
|
+
this.options = options;
|
|
13
|
+
const lsOptions = {
|
|
14
|
+
base: Computed.name,
|
|
15
|
+
...(typeof options === 'string' ? { name: options } : options),
|
|
16
|
+
_skipValues: [Computed._EMPTY],
|
|
17
|
+
};
|
|
18
|
+
this._ls = new Signal(Computed._EMPTY, lsOptions);
|
|
19
|
+
this.obs = this._ls.obs.pipe(map((value) => {
|
|
20
|
+
if (value === Computed._EMPTY) {
|
|
21
|
+
return this._start();
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}), distinctUntilChanged(), finalize(() => {
|
|
25
|
+
this._stop();
|
|
26
|
+
}), share({
|
|
27
|
+
connector: () => new ReplaySubject(1),
|
|
28
|
+
resetOnRefCountZero: true,
|
|
29
|
+
resetOnComplete: true,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
get() {
|
|
33
|
+
DependencyTracker.track({
|
|
34
|
+
getRang: () => {
|
|
35
|
+
if (!this._effect) {
|
|
36
|
+
throw new Error('Effect in not started. Possibly maximum call stack size exceeded.');
|
|
37
|
+
}
|
|
38
|
+
return this._effect._getRang();
|
|
39
|
+
},
|
|
40
|
+
obs: this.obs,
|
|
41
|
+
});
|
|
42
|
+
const v = this._ls.peek();
|
|
43
|
+
if (v === Computed._EMPTY) {
|
|
44
|
+
return this._computeFn();
|
|
45
|
+
}
|
|
46
|
+
return v;
|
|
47
|
+
}
|
|
48
|
+
peek() {
|
|
49
|
+
const v = this._ls.peek();
|
|
50
|
+
if (v === Computed._EMPTY) {
|
|
51
|
+
return this._computeFn();
|
|
52
|
+
}
|
|
53
|
+
return v;
|
|
54
|
+
}
|
|
55
|
+
_start() {
|
|
7
56
|
let initialValue = Computed._EMPTY;
|
|
8
|
-
|
|
57
|
+
this._effect = new Effect(() => {
|
|
9
58
|
if (initialValue === Computed._EMPTY) {
|
|
10
|
-
initialValue =
|
|
59
|
+
initialValue = this._computeFn();
|
|
60
|
+
this._ls.set(initialValue);
|
|
11
61
|
return;
|
|
12
62
|
}
|
|
13
|
-
this.
|
|
14
|
-
this.value = computeFn();
|
|
15
|
-
}, () => {
|
|
16
|
-
this.complete();
|
|
63
|
+
this._ls.set(this._computeFn());
|
|
17
64
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this._effect = effect;
|
|
65
|
+
if (initialValue === Computed._EMPTY) {
|
|
66
|
+
throw new Error('Computed value is not initialized');
|
|
67
|
+
}
|
|
68
|
+
return initialValue;
|
|
23
69
|
}
|
|
24
|
-
|
|
25
|
-
if (this.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
70
|
+
_stop() {
|
|
71
|
+
if (this._effect) {
|
|
72
|
+
this._effect.unsubscribe();
|
|
73
|
+
this._effect = null;
|
|
74
|
+
}
|
|
75
|
+
this._ls.set(Computed._EMPTY);
|
|
29
76
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
77
|
+
// === static ===
|
|
78
|
+
static _EMPTY = Symbol('empty');
|
|
79
|
+
static create(computeFn, options) {
|
|
80
|
+
const lc = new Computed(computeFn, options);
|
|
81
|
+
function computedFn() {
|
|
82
|
+
return lc.get();
|
|
83
|
+
}
|
|
84
|
+
computedFn.peek = () => lc.peek();
|
|
85
|
+
computedFn.get = () => lc.get();
|
|
86
|
+
computedFn.obs = lc.obs;
|
|
87
|
+
return computedFn;
|
|
35
88
|
}
|
|
36
89
|
}
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { SubscriptionLike } from "rxjs";
|
|
2
|
+
type Teardown = () => void;
|
|
3
|
+
type EffectFn = () => void | Teardown;
|
|
2
4
|
export declare class Effect implements SubscriptionLike {
|
|
3
|
-
private _onComplete?;
|
|
4
5
|
private _subscriptions;
|
|
5
6
|
private _teardown?;
|
|
6
|
-
protected readonly _scopeDestroyedSub: import("rxjs").Subscription | undefined;
|
|
7
7
|
closed: boolean;
|
|
8
|
-
_rang
|
|
9
|
-
constructor(effectFn:
|
|
8
|
+
private _rang;
|
|
9
|
+
constructor(effectFn: EffectFn);
|
|
10
10
|
/**
|
|
11
11
|
* Выполняет функцию в tracked-контексте, подписываясь на Tracker.
|
|
12
12
|
*/
|
|
13
13
|
private _runInTrackedContext;
|
|
14
|
-
|
|
14
|
+
unsubscribe(): void;
|
|
15
|
+
_getRang(): number;
|
|
15
16
|
/**
|
|
16
|
-
* @deprecated Use `
|
|
17
|
+
* @deprecated Use `unsubscribe()` method instead.
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
+
complete(): void;
|
|
20
|
+
private _callTeardown;
|
|
21
|
+
static create(effectFn: EffectFn): Effect;
|
|
19
22
|
}
|
|
23
|
+
export {};
|