async-reactivity 2.0.6 → 2.0.8

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/lib/computed.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import Tracker from "./tracker.js";
2
+ import defaultIsEqual from "./defaultIsEqual.js";
2
3
  var ComputedState;
3
4
  (function (ComputedState) {
4
5
  ComputedState[ComputedState["Invalid"] = 0] = "Invalid";
@@ -11,14 +12,16 @@ class CircularDependencyError extends Error {
11
12
  }
12
13
  export default class Computed extends Tracker {
13
14
  getter;
15
+ isEqual;
14
16
  state = ComputedState.Invalid;
15
17
  dependencies = new Map();
16
18
  computePromise;
17
19
  computePromiseActions;
18
20
  lastComputeAttemptPromise;
19
- constructor(getter) {
21
+ constructor(getter, isEqual = (defaultIsEqual)) {
20
22
  super();
21
23
  this.getter = getter;
24
+ this.isEqual = isEqual;
22
25
  this.prepareComputePromise();
23
26
  }
24
27
  prepareComputePromise() {
@@ -59,20 +62,21 @@ export default class Computed extends Tracker {
59
62
  }
60
63
  this.state = ComputedState.Computing;
61
64
  this.clearDependencies();
62
- const lastValue = this._value;
63
- this._value = this.getter(this.trackDependency);
64
- if (this._value instanceof Promise) {
65
- const computeAttemptPromise = this._value
65
+ const newValue = this.getter(this.trackDependency);
66
+ if (this.isEqual(newValue, this._value)) {
67
+ this.handlePromiseThen(this.lastComputeAttemptPromise, this._value);
68
+ this.validateDependents();
69
+ }
70
+ else if (newValue instanceof Promise) {
71
+ const computeAttemptPromise = newValue
66
72
  .then(result => this.handlePromiseThen(computeAttemptPromise, result))
67
73
  .catch(error => this.handlePromiseCatch(computeAttemptPromise, error));
68
74
  this.lastComputeAttemptPromise = computeAttemptPromise;
69
75
  this._value = this.computePromise;
70
76
  }
71
77
  else {
78
+ this._value = newValue;
72
79
  this.handlePromiseThen(this.lastComputeAttemptPromise, this._value);
73
- if (lastValue === this._value) {
74
- this.validateDependents();
75
- }
76
80
  }
77
81
  return this._value;
78
82
  }
@@ -130,6 +130,15 @@ describe('computed', function () {
130
130
  assert.strictEqual(c.value, 6);
131
131
  assert.strictEqual(gate, 2);
132
132
  });
133
+ it('isEqual', function () {
134
+ const a = new Ref(1);
135
+ const b = new Computed((value) => {
136
+ return value(a);
137
+ }, (_newValue, oldValue) => oldValue !== undefined);
138
+ assert.strictEqual(b.value, 1);
139
+ a.value = 2;
140
+ assert.strictEqual(b.value, 1);
141
+ });
133
142
  });
134
143
  describe('async computed', function () {
135
144
  it('getter', async function () {
@@ -0,0 +1 @@
1
+ export default (v1, v2) => v1 === v2;
package/lib/isEqual.js ADDED
@@ -0,0 +1 @@
1
+ export default (v1, v2) => v1 === v2;
package/lib/ref.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import Tracker from "./tracker.js";
2
- const defaultIsEqual = (v1, v2) => v1 === v2;
2
+ import defaultIsEqual from "./defaultIsEqual.js";
3
3
  export default class Ref extends Tracker {
4
4
  isEqual;
5
5
  constructor(_value, isEqual = (defaultIsEqual)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "async-reactivity",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "types": "types/index.d.ts",
@@ -152,6 +152,18 @@ describe('computed', function () {
152
152
  assert.strictEqual(c.value, 6);
153
153
  assert.strictEqual(gate, 2);
154
154
  });
155
+
156
+ it('isEqual', function() {
157
+ const a = new Ref(1);
158
+ const b = new Computed((value) => {
159
+ return value(a);
160
+ }, (_newValue, oldValue) => oldValue !== undefined);
161
+
162
+ assert.strictEqual(b.value, 1);
163
+
164
+ a.value = 2;
165
+ assert.strictEqual(b.value, 1);
166
+ });
155
167
  });
156
168
 
157
169
  describe('async computed', function () {
package/src/computed.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import Dependency from "./dependency.js";
2
2
  import Dependent from "./dependent.js";
3
3
  import Tracker from "./tracker.js";
4
+ import defaultIsEqual from "./defaultIsEqual.js";
4
5
 
5
6
  declare type TrackValue = <T>(dependency: Dependency<T>) => T;
6
7
  export declare type ComputeFunc<T> = (value: TrackValue) => T;
@@ -17,15 +18,17 @@ class CircularDependencyError extends Error { }
17
18
 
18
19
  export default class Computed<T> extends Tracker<T> implements Dependent, Dependency<T> {
19
20
  getter: ComputeFunc<T>;
21
+ isEqual: typeof defaultIsEqual<T>;
20
22
  private state = ComputedState.Invalid;
21
23
  private dependencies = new Map<Dependency<any>, boolean>();
22
24
  private computePromise?: T;
23
25
  private computePromiseActions?: { resolve: Function, reject: Function };
24
26
  private lastComputeAttemptPromise?: Promise<void>;
25
27
 
26
- constructor(getter: ComputeFunc<T>) {
28
+ constructor(getter: ComputeFunc<T>, isEqual = defaultIsEqual<T>) {
27
29
  super();
28
30
  this.getter = getter;
31
+ this.isEqual = isEqual;
29
32
  this.prepareComputePromise();
30
33
  }
31
34
 
@@ -71,19 +74,19 @@ export default class Computed<T> extends Tracker<T> implements Dependent, Depend
71
74
  this.state = ComputedState.Computing;
72
75
  this.clearDependencies();
73
76
 
74
- const lastValue = this._value;
75
- this._value = this.getter(this.trackDependency);
76
- if (this._value instanceof Promise) {
77
- const computeAttemptPromise = this._value
77
+ const newValue: T = this.getter(this.trackDependency);
78
+ if (this.isEqual(newValue, this._value)) {
79
+ this.handlePromiseThen(this.lastComputeAttemptPromise!, this._value);
80
+ this.validateDependents();
81
+ } else if (newValue instanceof Promise) {
82
+ const computeAttemptPromise = newValue
78
83
  .then(result => this.handlePromiseThen(computeAttemptPromise, result))
79
84
  .catch(error => this.handlePromiseCatch(computeAttemptPromise, error)) as Promise<void>;
80
85
  this.lastComputeAttemptPromise = computeAttemptPromise;
81
86
  this._value = this.computePromise!;
82
87
  } else {
88
+ this._value = newValue;
83
89
  this.handlePromiseThen(this.lastComputeAttemptPromise!, this._value);
84
- if (lastValue === this._value) {
85
- this.validateDependents();
86
- }
87
90
  }
88
91
  return this._value!;
89
92
  }
@@ -0,0 +1 @@
1
+ export default <T>(v1?: T, v2?: T) => v1 === v2;
package/src/ref.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import Dependency from "./dependency.js";
2
2
  import Tracker from "./tracker.js";
3
-
4
- const defaultIsEqual = <T>(v1?: T, v2?: T) => v1 === v2;
3
+ import defaultIsEqual from "./defaultIsEqual.js";
5
4
 
6
5
  export default class Ref<T> extends Tracker<T> implements Dependency<T> {
7
- private isEqual: (a?: T, b?: T) => boolean;
6
+ private isEqual: typeof defaultIsEqual<T>;
8
7
 
9
8
  constructor(_value: T, isEqual = defaultIsEqual<T>) {
10
9
  super();
@@ -1,17 +1,19 @@
1
1
  import Dependency from "./dependency.js";
2
2
  import Dependent from "./dependent.js";
3
3
  import Tracker from "./tracker.js";
4
+ import defaultIsEqual from "./defaultIsEqual.js";
4
5
  declare type TrackValue = <T>(dependency: Dependency<T>) => T;
5
6
  export declare type ComputeFunc<T> = (value: TrackValue) => T;
6
7
  export declare type ComputeFuncScoped<T1, T2> = (value: TrackValue, scope: T1) => T2;
7
8
  export default class Computed<T> extends Tracker<T> implements Dependent, Dependency<T> {
8
9
  getter: ComputeFunc<T>;
10
+ isEqual: typeof defaultIsEqual<T>;
9
11
  private state;
10
12
  private dependencies;
11
13
  private computePromise?;
12
14
  private computePromiseActions?;
13
15
  private lastComputeAttemptPromise?;
14
- constructor(getter: ComputeFunc<T>);
16
+ constructor(getter: ComputeFunc<T>, isEqual?: (v1?: T | undefined, v2?: T | undefined) => boolean);
15
17
  private prepareComputePromise;
16
18
  get value(): T;
17
19
  private compute;
@@ -1 +1 @@
1
- {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9D,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,CAAC;AAC9D,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;AAWrF,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,cAAc,CAAC,CAAI;IAC3B,OAAO,CAAC,qBAAqB,CAAC,CAA0C;IACxE,OAAO,CAAC,yBAAyB,CAAC,CAAgB;gBAEtC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAMlC,OAAO,CAAC,qBAAqB;IAS7B,IAAW,KAAK,IAAI,CAAC,CAMpB;IAED,OAAO,CAAC,OAAO;IA0Cf,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,iBAAiB;IAMlB,UAAU;IAUV,eAAe;IAKf,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;IAI3C,OAAO,CAAC,kBAAkB;IAMnB,OAAO;CAOjB"}
1
+ {"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../src/computed.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD,OAAO,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9D,MAAM,CAAC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,CAAC,CAAC;AAC9D,MAAM,CAAC,OAAO,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;AAWrF,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,cAAc,CAAC,CAAI;IAC3B,OAAO,CAAC,qBAAqB,CAAC,CAA0C;IACxE,OAAO,CAAC,yBAAyB,CAAC,CAAgB;gBAEtC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,sDAAoB;IAO/D,OAAO,CAAC,qBAAqB;IAS7B,IAAW,KAAK,IAAI,CAAC,CAMpB;IAED,OAAO,CAAC,OAAO;IA0Cf,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,eAAe,CAAwC;IAE/D,OAAO,CAAC,iBAAiB;IAMlB,UAAU;IAUV,eAAe;IAKf,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;IAI3C,OAAO,CAAC,kBAAkB;IAMnB,OAAO;CAOjB"}
@@ -0,0 +1,3 @@
1
+ declare const _default: <T>(v1?: T, v2?: T) => boolean;
2
+ export default _default;
3
+ //# sourceMappingURL=defaultIsEqual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultIsEqual.d.ts","sourceRoot":"","sources":["../src/defaultIsEqual.ts"],"names":[],"mappings":"yBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;AAAjC,wBAAgD"}
@@ -0,0 +1,3 @@
1
+ declare const _default: <T>(v1?: T, v2?: T) => boolean;
2
+ export default _default;
3
+ //# sourceMappingURL=isEqual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isEqual.d.ts","sourceRoot":"","sources":["../src/isEqual.ts"],"names":[],"mappings":"yBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;AAAjC,wBAAgD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,MAAM,CAAC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,OAAO,CAA4B;gBAE/B,MAAM,EAAE,CAAC,EAAE,OAAO,sDAAoB;IAMlD,IAAW,KAAK,CAAC,MAAM,EAAE,CAAC,EAMzB;IAED,IAAW,KAAK,IAAI,CAAC,CAEpB;CACJ"}
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,OAAO,MAAM,cAAc,CAAC;AAGnC,MAAM,CAAC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAE,YAAW,UAAU,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,OAAO,CAA2B;gBAE9B,MAAM,EAAE,CAAC,EAAE,OAAO,sDAAoB;IAMlD,IAAW,KAAK,CAAC,MAAM,EAAE,CAAC,EAMzB;IAED,IAAW,KAAK,IAAI,CAAC,CAEpB;CACJ"}