@fbltd/async 1.0.36 → 1.0.39

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.
@@ -1,7 +1,7 @@
1
1
  import { PromiseConfiguration } from "../promise-configuration.js";
2
2
  import { baseComparer } from "./utils.js";
3
- import { observationState } from "./observe.state.js";
4
3
  import { symAI } from "../constants.js";
4
+ import { observationState } from "./observe.state.js";
5
5
  export class Dependency {
6
6
  _value;
7
7
  reactionPromise;
@@ -38,7 +38,7 @@ export class Dependency {
38
38
  return this._value;
39
39
  }
40
40
  get done() {
41
- return this.abortPromise.isFulfilled;
41
+ return !this.abortPromise || this.abortPromise.isFulfilled;
42
42
  }
43
43
  [symAI](thisStreamConfig = {}) {
44
44
  const externalPromises = [];
@@ -49,24 +49,19 @@ export class Dependency {
49
49
  firstPromise.resolve();
50
50
  externalPromises.push(firstPromise.promise);
51
51
  }
52
- if (thisStreamConfig.externalDispose) {
53
- externalPromises.push(thisStreamConfig.externalDispose.promise);
54
- }
55
52
  const owner = this;
56
- let done = false;
57
53
  return {
58
54
  owner,
59
- dispose: owner.dispose.bind(owner),
55
+ dispose: () => { },
60
56
  get isDisposed() {
61
- return done || owner.done;
57
+ return false;
62
58
  },
63
59
  next: async () => {
64
60
  await Promise.race([
65
- ...externalPromises,
66
61
  owner.next(),
62
+ ...externalPromises,
67
63
  ]);
68
- if (this.done || thisStreamConfig.externalDispose?.isFulfilled) {
69
- done = true;
64
+ if (this.done) {
70
65
  return { done: true };
71
66
  }
72
67
  if (firstPromise) {
@@ -101,24 +96,24 @@ export class Dependency {
101
96
  * Another subscribe for current race
102
97
  */
103
98
  async next() {
104
- let race = this.getOrCreateRace();
105
- await race;
99
+ const done = { done: true };
100
+ const owner = this;
101
+ if (this.done)
102
+ return done;
103
+ await this.getOrCreateRace();
106
104
  this._race = undefined;
107
- if (this.done) {
108
- return { done: true };
109
- }
105
+ if (this.done)
106
+ return done;
107
+ this.abortPromise = new PromiseConfiguration();
110
108
  return {
111
109
  done: false,
112
110
  get value() {
113
- return this.value;
111
+ return owner.value;
114
112
  }
115
113
  };
116
114
  }
117
- get disposePromise() {
118
- return this.abortPromise.promise;
119
- }
120
115
  dispose() {
121
- this.abortPromise.resolve();
122
- this.reactionPromise = undefined;
116
+ this.abortPromise?.resolve();
117
+ this.abortPromise = this.reactionPromise = undefined;
123
118
  }
124
119
  }
@@ -10,12 +10,23 @@ export class DependencyStream {
10
10
  constructor(owner) {
11
11
  this.owner = owner;
12
12
  this.selfDispose = new PromiseConfiguration();
13
- this.iterator = owner[symAI]({ externalDispose: this.selfDispose });
13
+ this.iterator = owner[symAI]();
14
14
  }
15
15
  [symAI]() {
16
+ const done = { done: true };
16
17
  return {
17
- next: () => {
18
- return this.iterator.next();
18
+ next: async () => {
19
+ if (this.selfDispose.isFulfilled)
20
+ return done;
21
+ const nextRes = this.iterator.next();
22
+ await Promise.race([
23
+ this.selfDispose.promise,
24
+ nextRes,
25
+ ]);
26
+ if (this.selfDispose.isFulfilled)
27
+ return done;
28
+ this.selfDispose = new PromiseConfiguration();
29
+ return nextRes;
19
30
  }
20
31
  };
21
32
  }
@@ -6,7 +6,7 @@ export function raceStream(deps) {
6
6
  .entries(deps)
7
7
  .reduce((acc, [key, dep]) => {
8
8
  acc[0].push(key);
9
- acc[1].push(dep[symAI]({ externalDispose }));
9
+ acc[1].push(dep[symAI]());
10
10
  return acc;
11
11
  }, [[], []]);
12
12
  function isDisposed() {
@@ -18,12 +18,20 @@ export function raceStream(deps) {
18
18
  return isDisposed();
19
19
  },
20
20
  [symAI]() {
21
+ const done = { done: true };
21
22
  return {
22
23
  next: async () => {
23
- const res = await Promise.race(streams.map(s => s.next()));
24
- if (res.done) {
24
+ if (externalDispose.isFulfilled)
25
+ return done;
26
+ const res = await Promise.race([
27
+ externalDispose.promise,
28
+ ...streams.map(s => s.next())
29
+ ]);
30
+ if (externalDispose.isFulfilled)
31
+ return done;
32
+ externalDispose = new PromiseConfiguration();
33
+ if (res.done)
25
34
  return res;
26
- }
27
35
  const value = keys.reduce((acc, key) => {
28
36
  acc[key] = deps[key].value;
29
37
  return acc;
@@ -13,7 +13,7 @@ export function reaction(fn, config) {
13
13
  depsArray = Array.from(deps);
14
14
  beforeValues = depsArray.map(dep => dep.value_unsafe);
15
15
  const promises = depsArray.map(dep => dep.next());
16
- promises.push(dep.disposePromise);
16
+ // promises.push(dep.disposePromise as Promise<any>);
17
17
  await Promise.race(depsArray.map(dep => dep.next()));
18
18
  if (dep.done)
19
19
  return { done: true };
package/dist/bin/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./dependency/index.js";
2
2
  export * from "./delay.js";
3
3
  export * from "./promise-configuration.js";
4
+ export * from "./debounce.js";
@@ -1,4 +1,3 @@
1
- import { PromiseConfiguration } from "../promise-configuration.js";
2
1
  import { Dependency } from "./dependency.ts";
3
2
  export interface IStreamIterator<TValue = any> {
4
3
  owner: Dependency;
@@ -29,9 +28,4 @@ export type IThisStreamConfig = Partial<{
29
28
  * stream dispose has priority over first reaction
30
29
  */
31
30
  withReactionOnSubscribe: boolean;
32
- /**
33
- * Dispose happens anyway right after current task,
34
- * wherever value of dependency was changed
35
- */
36
- externalDispose: PromiseConfiguration<any>;
37
31
  }>;
@@ -23,11 +23,10 @@ export declare class Dependency<T = any> {
23
23
  */
24
24
  next(): Promise<{
25
25
  done: true;
26
- value?: never;
26
+ value: void;
27
27
  } | {
28
28
  done: boolean;
29
29
  readonly value: T;
30
30
  }>;
31
- get disposePromise(): Promise<void>;
32
31
  dispose(this: Dependency<T>): void;
33
32
  }
@@ -3,7 +3,7 @@ import { symAI } from "../constants.ts";
3
3
  import { Dependency } from "./dependency.ts";
4
4
  export declare class DependencyStream<T = any> implements IDependencyStream {
5
5
  readonly owner: Dependency;
6
- private readonly selfDispose;
6
+ private selfDispose;
7
7
  private readonly iterator;
8
8
  get isDisposed(): boolean;
9
9
  constructor(owner: Dependency);
@@ -1,3 +1,4 @@
1
1
  export * from './dependency/index.ts';
2
2
  export * from './delay.ts';
3
3
  export * from './promise-configuration.ts';
4
+ export * from './debounce.ts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fbltd/async",
3
- "version": "1.0.36",
3
+ "version": "1.0.39",
4
4
  "description": "Miscellaneous async utils",
5
5
  "homepage": "https://github.com/GlennMiller1991/async",
6
6
  "type": "module",