@e280/strata 0.2.8 → 0.3.0-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.
Files changed (153) hide show
  1. package/README.md +11 -47
  2. package/package.json +3 -3
  3. package/s/index.ts +0 -1
  4. package/s/prism/prism.test.ts +2 -1
  5. package/s/prism/prism.ts +1 -1
  6. package/s/signals/derived/class.ts +34 -0
  7. package/s/signals/derived/fn.ts +36 -0
  8. package/s/signals/{tests/derived.test.ts → derived/test.ts} +13 -14
  9. package/s/signals/effect/effect.ts +7 -0
  10. package/s/signals/effect/test.ts +172 -0
  11. package/s/signals/effect/watch.ts +32 -0
  12. package/s/signals/index.ts +11 -7
  13. package/s/signals/lazy/class.ts +74 -0
  14. package/s/signals/lazy/fn.ts +22 -0
  15. package/s/signals/{tests/lazy.test.ts → lazy/test.ts} +23 -12
  16. package/s/signals/signal/class.ts +77 -0
  17. package/s/signals/signal/fn.ts +31 -0
  18. package/s/signals/{tests/signal.test.ts → signal/test.ts} +56 -59
  19. package/s/signals/signals.test.ts +8 -8
  20. package/s/signals/types.ts +4 -23
  21. package/s/signals/utils/default-compare.ts +1 -1
  22. package/s/signals/utils/symbols.ts +9 -0
  23. package/s/tests.test.ts +1 -57
  24. package/x/index.d.ts +0 -1
  25. package/x/index.js +0 -1
  26. package/x/index.js.map +1 -1
  27. package/x/prism/prism.js.map +1 -1
  28. package/x/prism/prism.test.js +1 -1
  29. package/x/prism/prism.test.js.map +1 -1
  30. package/x/signals/derived/class.d.ts +14 -0
  31. package/x/signals/derived/class.js +23 -0
  32. package/x/signals/derived/class.js.map +1 -0
  33. package/x/signals/derived/fn.d.ts +3 -0
  34. package/x/signals/derived/fn.js +28 -0
  35. package/x/signals/derived/fn.js.map +1 -0
  36. package/x/signals/{tests/derived.test.d.ts → derived/test.d.ts} +1 -3
  37. package/x/signals/{tests/derived.test.js → derived/test.js} +14 -15
  38. package/x/signals/derived/test.js.map +1 -0
  39. package/x/signals/effect/effect.d.ts +1 -0
  40. package/x/signals/effect/effect.js +5 -0
  41. package/x/signals/effect/effect.js.map +1 -0
  42. package/x/signals/{tests/effect.test.d.ts → effect/test.d.ts} +7 -0
  43. package/x/signals/effect/test.js +132 -0
  44. package/x/signals/effect/test.js.map +1 -0
  45. package/x/signals/effect/watch.d.ts +4 -0
  46. package/x/signals/effect/watch.js +25 -0
  47. package/x/signals/effect/watch.js.map +1 -0
  48. package/x/signals/index.d.ts +8 -7
  49. package/x/signals/index.js +8 -7
  50. package/x/signals/index.js.map +1 -1
  51. package/x/signals/lazy/class.d.ts +19 -0
  52. package/x/signals/lazy/class.js +59 -0
  53. package/x/signals/lazy/class.js.map +1 -0
  54. package/x/signals/lazy/fn.d.ts +3 -0
  55. package/x/signals/lazy/fn.js +17 -0
  56. package/x/signals/lazy/fn.js.map +1 -0
  57. package/x/signals/{tests/lazy.test.d.ts → lazy/test.d.ts} +2 -3
  58. package/x/signals/{tests/lazy.test.js → lazy/test.js} +23 -13
  59. package/x/signals/lazy/test.js.map +1 -0
  60. package/x/signals/signal/class.d.ts +20 -0
  61. package/x/signals/signal/class.js +57 -0
  62. package/x/signals/signal/class.js.map +1 -0
  63. package/x/signals/signal/fn.d.ts +7 -0
  64. package/x/signals/signal/fn.js +23 -0
  65. package/x/signals/signal/fn.js.map +1 -0
  66. package/x/signals/{tests/signal.test.d.ts → signal/test.d.ts} +8 -7
  67. package/x/signals/{tests/signal.test.js → signal/test.js} +50 -46
  68. package/x/signals/signal/test.js.map +1 -0
  69. package/x/signals/signals.test.d.ts +25 -20
  70. package/x/signals/signals.test.js +8 -8
  71. package/x/signals/signals.test.js.map +1 -1
  72. package/x/signals/types.d.ts +4 -19
  73. package/x/signals/utils/default-compare.js +1 -1
  74. package/x/signals/utils/default-compare.js.map +1 -1
  75. package/x/signals/utils/symbols.d.ts +7 -0
  76. package/x/signals/utils/symbols.js +8 -0
  77. package/x/signals/utils/symbols.js.map +1 -0
  78. package/x/tests.test.js +1 -45
  79. package/x/tests.test.js.map +1 -1
  80. package/s/signals/core/derived.ts +0 -65
  81. package/s/signals/core/effect.ts +0 -31
  82. package/s/signals/core/lazy.ts +0 -78
  83. package/s/signals/core/parts/reactive.ts +0 -12
  84. package/s/signals/core/parts/readable.ts +0 -16
  85. package/s/signals/core/signal.ts +0 -101
  86. package/s/signals/porcelain.ts +0 -30
  87. package/s/signals/tests/effect.test.ts +0 -89
  88. package/s/tree/index.ts +0 -7
  89. package/s/tree/parts/branch.ts +0 -55
  90. package/s/tree/parts/chronobranch.ts +0 -86
  91. package/s/tree/parts/persistence.ts +0 -31
  92. package/s/tree/parts/trunk.ts +0 -70
  93. package/s/tree/parts/types.ts +0 -70
  94. package/s/tree/parts/utils/immute.ts +0 -43
  95. package/s/tree/parts/utils/process-options.ts +0 -7
  96. package/s/tree/parts/utils/setup.ts +0 -40
  97. package/s/tree/tree.test.ts +0 -366
  98. package/x/signals/core/derived.d.ts +0 -10
  99. package/x/signals/core/derived.js +0 -52
  100. package/x/signals/core/derived.js.map +0 -1
  101. package/x/signals/core/effect.d.ts +0 -5
  102. package/x/signals/core/effect.js +0 -17
  103. package/x/signals/core/effect.js.map +0 -1
  104. package/x/signals/core/lazy.d.ts +0 -11
  105. package/x/signals/core/lazy.js +0 -60
  106. package/x/signals/core/lazy.js.map +0 -1
  107. package/x/signals/core/parts/reactive.d.ts +0 -5
  108. package/x/signals/core/parts/reactive.js +0 -9
  109. package/x/signals/core/parts/reactive.js.map +0 -1
  110. package/x/signals/core/parts/readable.d.ts +0 -6
  111. package/x/signals/core/parts/readable.js +0 -15
  112. package/x/signals/core/parts/readable.js.map +0 -1
  113. package/x/signals/core/signal.d.ts +0 -13
  114. package/x/signals/core/signal.js +0 -77
  115. package/x/signals/core/signal.js.map +0 -1
  116. package/x/signals/porcelain.d.ts +0 -8
  117. package/x/signals/porcelain.js +0 -15
  118. package/x/signals/porcelain.js.map +0 -1
  119. package/x/signals/tests/derived.test.js.map +0 -1
  120. package/x/signals/tests/effect.test.js +0 -72
  121. package/x/signals/tests/effect.test.js.map +0 -1
  122. package/x/signals/tests/lazy.test.js.map +0 -1
  123. package/x/signals/tests/signal.test.js.map +0 -1
  124. package/x/tree/index.d.ts +0 -5
  125. package/x/tree/index.js +0 -6
  126. package/x/tree/index.js.map +0 -1
  127. package/x/tree/parts/branch.d.ts +0 -14
  128. package/x/tree/parts/branch.js +0 -42
  129. package/x/tree/parts/branch.js.map +0 -1
  130. package/x/tree/parts/chronobranch.d.ts +0 -25
  131. package/x/tree/parts/chronobranch.js +0 -75
  132. package/x/tree/parts/chronobranch.js.map +0 -1
  133. package/x/tree/parts/persistence.d.ts +0 -2
  134. package/x/tree/parts/persistence.js +0 -23
  135. package/x/tree/parts/persistence.js.map +0 -1
  136. package/x/tree/parts/trunk.d.ts +0 -19
  137. package/x/tree/parts/trunk.js +0 -57
  138. package/x/tree/parts/trunk.js.map +0 -1
  139. package/x/tree/parts/types.d.ts +0 -28
  140. package/x/tree/parts/types.js +0 -2
  141. package/x/tree/parts/types.js.map +0 -1
  142. package/x/tree/parts/utils/immute.d.ts +0 -11
  143. package/x/tree/parts/utils/immute.js +0 -33
  144. package/x/tree/parts/utils/immute.js.map +0 -1
  145. package/x/tree/parts/utils/process-options.d.ts +0 -2
  146. package/x/tree/parts/utils/process-options.js +0 -4
  147. package/x/tree/parts/utils/process-options.js.map +0 -1
  148. package/x/tree/parts/utils/setup.d.ts +0 -8
  149. package/x/tree/parts/utils/setup.js +0 -24
  150. package/x/tree/parts/utils/setup.js.map +0 -1
  151. package/x/tree/tree.test.d.ts +0 -40
  152. package/x/tree/tree.test.js +0 -325
  153. package/x/tree/tree.test.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { Science, test, expect, spy } from "@e280/science";
2
- import { effect } from "../core/effect.js";
3
- import { derived, signal } from "../porcelain.js";
2
+ import { derived } from "./fn.js";
3
+ import { signal } from "../signal/fn.js";
4
+ import { effect } from "../effect/effect.js";
4
5
  export default Science.suite({
5
6
  "basic": test(async () => {
6
7
  const a = signal(1);
@@ -31,7 +32,7 @@ export default Science.suite({
31
32
  "effect doesn't overreact to derived": test(async () => {
32
33
  const a = signal(1);
33
34
  const b = signal(10);
34
- const product = signal.derived(() => a.value * b.value);
35
+ const product = derived(() => a.value * b.value);
35
36
  const derivedSpy = spy(() => { });
36
37
  product.on(derivedSpy);
37
38
  let mutations = 0;
@@ -51,7 +52,7 @@ export default Science.suite({
51
52
  "derived.on": test(async () => {
52
53
  const a = signal(1);
53
54
  const b = signal(10);
54
- const product = signal.derived(() => a.value * b.value);
55
+ const product = derived(() => a.value * b.value);
55
56
  expect(product.value).is(10);
56
57
  const mole = spy((_v) => { });
57
58
  product.on(mole);
@@ -64,7 +65,7 @@ export default Science.suite({
64
65
  "derived.on not called if result doesn't change": test(async () => {
65
66
  const a = signal(1);
66
67
  const b = signal(10);
67
- const product = signal.derived(() => a.value * b.value);
68
+ const product = derived(() => a.value * b.value);
68
69
  expect(product.value).is(10);
69
70
  const mole = spy((_v) => { });
70
71
  product.on(mole);
@@ -77,15 +78,13 @@ export default Science.suite({
77
78
  expect(product.value).is(20);
78
79
  expect(mole.spy.calls.length).is(1);
79
80
  }),
80
- "hipster fns": Science.suite({
81
- "basic": test(async () => {
82
- const a = signal(1);
83
- const b = signal(10);
84
- const product = derived(() => a() * b());
85
- expect(product()).is(10);
86
- await a(2);
87
- expect(product()).is(20);
88
- }),
81
+ "hipster syntax": test(async () => {
82
+ const a = signal(1);
83
+ const b = signal(10);
84
+ const product = derived(() => a() * b());
85
+ expect(product()).is(10);
86
+ await a(2);
87
+ expect(product()).is(20);
89
88
  }),
90
89
  });
91
- //# sourceMappingURL=derived.test.js.map
90
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../s/signals/derived/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function effect(collector: () => void, responder?: () => void): () => void;
@@ -0,0 +1,5 @@
1
+ import { watch } from "./watch.js";
2
+ export function effect(collector, responder) {
3
+ return watch(collector, responder).dispose;
4
+ }
5
+ //# sourceMappingURL=effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../../../s/signals/effect/effect.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAEhC,MAAM,UAAU,MAAM,CAAC,SAAqB,EAAE,SAAsB;IACnE,OAAO,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAA;AAC3C,CAAC"}
@@ -1,6 +1,13 @@
1
1
  import { Science } from "@e280/science";
2
2
  declare const _default: {
3
+ watch: {
4
+ "responder gets value": Science.Test;
5
+ "responder not called until change": Science.Test;
6
+ "watch updates dynamic dependencies": Science.Test;
7
+ };
3
8
  "tracks signal changes": Science.Test;
9
+ "correct signal effect order": Science.Test;
10
+ "simple effect called the correct number of times": Science.Test;
4
11
  "is only called when signal actually changes": Science.Test;
5
12
  debounced: Science.Test;
6
13
  "can be disposed": Science.Test;
@@ -0,0 +1,132 @@
1
+ import { Science, test, expect } from "@e280/science";
2
+ import { watch } from "./watch.js";
3
+ import { effect } from "./effect.js";
4
+ import { signal } from "../signal/fn.js";
5
+ export default Science.suite({
6
+ "watch": Science.suite({
7
+ "responder gets value": test(async () => {
8
+ const count = signal(1);
9
+ let collected = 0;
10
+ watch(() => count(), x => { collected = x; });
11
+ expect(collected).is(0);
12
+ await count(2);
13
+ expect(collected).is(2);
14
+ }),
15
+ "responder not called until change": test(async () => {
16
+ const count = signal(1);
17
+ let calls = 0;
18
+ watch(() => count(), () => { calls++; });
19
+ expect(calls).is(0);
20
+ await count(2);
21
+ expect(calls).is(1);
22
+ }),
23
+ "watch updates dynamic dependencies": test(async () => {
24
+ const toggle = signal(true);
25
+ const a = signal(1);
26
+ const b = signal(10);
27
+ let collected = 0;
28
+ watch(() => toggle() ? a() : b(), x => { collected = x; });
29
+ await a(2);
30
+ expect(collected).is(2);
31
+ await toggle(false);
32
+ expect(collected).is(10);
33
+ collected = 0;
34
+ await a(3);
35
+ expect(collected).is(0);
36
+ await b(11);
37
+ expect(collected).is(11);
38
+ })
39
+ }),
40
+ "tracks signal changes": test(async () => {
41
+ const count = signal(1);
42
+ let doubled = 0;
43
+ effect(() => doubled = count.value * 2);
44
+ expect(doubled).is(2);
45
+ await count.set(3);
46
+ expect(doubled).is(6);
47
+ }),
48
+ "correct signal effect order": test(async () => {
49
+ let order = [];
50
+ const count = signal(0);
51
+ effect(() => {
52
+ if (count.value)
53
+ order.push("effect");
54
+ });
55
+ order.push("before");
56
+ await count.set(1);
57
+ order.push("after");
58
+ expect(order.length).is(3);
59
+ expect(order[0]).is("before");
60
+ expect(order[1]).is("effect");
61
+ expect(order[2]).is("after");
62
+ }),
63
+ "simple effect called the correct number of times": test(async () => {
64
+ const count = signal(0);
65
+ let runs = 0;
66
+ effect(() => { count(); runs++; });
67
+ expect(runs).is(1);
68
+ await count(1);
69
+ expect(runs).is(2);
70
+ await count(2);
71
+ expect(runs).is(3);
72
+ }),
73
+ "is only called when signal actually changes": test(async () => {
74
+ const count = signal(1);
75
+ let runs = 0;
76
+ effect(() => {
77
+ count.get();
78
+ runs++;
79
+ });
80
+ expect(runs).is(1);
81
+ await count.set(999);
82
+ expect(runs).is(2);
83
+ await count.set(999);
84
+ expect(runs).is(2);
85
+ }),
86
+ "debounced": test(async () => {
87
+ const count = signal(1);
88
+ let runs = 0;
89
+ effect(() => {
90
+ count.get();
91
+ runs++;
92
+ });
93
+ expect(runs).is(1);
94
+ count.value++;
95
+ count.value++;
96
+ await count.set(count.get() + 1);
97
+ expect(runs).is(2);
98
+ }),
99
+ "can be disposed": test(async () => {
100
+ const count = signal(1);
101
+ let doubled = 0;
102
+ const dispose = effect(() => doubled = count.value * 2);
103
+ expect(doubled).is(2);
104
+ await count.set(3);
105
+ expect(doubled).is(6);
106
+ dispose();
107
+ await count.set(4);
108
+ expect(doubled).is(6); // old value
109
+ }),
110
+ "signal set promise waits for effects": test(async () => {
111
+ const count = signal(1);
112
+ let doubled = 0;
113
+ effect(() => doubled = count.value * 2);
114
+ expect(doubled).is(2);
115
+ await count.set(3);
116
+ expect(doubled).is(6);
117
+ }),
118
+ "only runs on change": test(async () => {
119
+ const sig = signal("a");
120
+ let runs = 0;
121
+ effect(() => {
122
+ sig.value;
123
+ runs++;
124
+ });
125
+ expect(runs).is(1);
126
+ await sig.set("a");
127
+ expect(runs).is(1);
128
+ await sig.set("b");
129
+ expect(runs).is(2);
130
+ }),
131
+ });
132
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../s/signals/effect/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function watch<Value>(collector: () => Value, responder?: (value: Value) => void): {
2
+ result: Value;
3
+ dispose: () => void;
4
+ };
@@ -0,0 +1,25 @@
1
+ import { microbounce } from "@e280/stz";
2
+ import { tracker } from "../../tracker/tracker.js";
3
+ export function watch(collector, responder) {
4
+ let disposers = [];
5
+ const dispose = () => {
6
+ for (const d of disposers)
7
+ d();
8
+ disposers = [];
9
+ };
10
+ const run = () => {
11
+ const { seen, result } = tracker.observe(collector);
12
+ for (const saw of seen)
13
+ disposers.push(tracker.subscribe(saw, reset));
14
+ return result;
15
+ };
16
+ const reset = microbounce(() => {
17
+ dispose();
18
+ if (responder)
19
+ responder(run());
20
+ else
21
+ run();
22
+ });
23
+ return { result: run(), dispose };
24
+ }
25
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../s/signals/effect/watch.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,WAAW,CAAA;AACrC,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAEhD,MAAM,UAAU,KAAK,CACnB,SAAsB,EACtB,SAAkC;IAGnC,IAAI,SAAS,GAAmB,EAAE,CAAA;IAElC,MAAM,OAAO,GAAG,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,EAAE,CAAA;QAC9B,SAAS,GAAG,EAAE,CAAA;IACf,CAAC,CAAA;IAED,MAAM,GAAG,GAAG,GAAG,EAAE;QAChB,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACjD,KAAK,MAAM,GAAG,IAAI,IAAI;YACrB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;QAC9C,OAAO,MAAM,CAAA;IACd,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,OAAO,EAAE,CAAA;QACT,IAAI,SAAS;YAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;;YAC1B,GAAG,EAAE,CAAA;IACX,CAAC,CAAC,CAAA;IAEF,OAAO,EAAC,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,EAAC,CAAA;AAChC,CAAC"}
@@ -1,10 +1,11 @@
1
- export * from "./core/parts/reactive.js";
2
- export * from "./core/parts/readable.js";
3
- export * from "./core/derived.js";
4
- export * from "./core/effect.js";
5
- export * from "./core/lazy.js";
6
- export * from "./core/signal.js";
1
+ export * from "./derived/fn.js";
2
+ export * from "./derived/class.js";
3
+ export * from "./effect/effect.js";
4
+ export * from "./effect/watch.js";
5
+ export * from "./lazy/fn.js";
6
+ export * from "./lazy/class.js";
7
7
  export * from "./r/map.js";
8
8
  export * from "./r/set.js";
9
- export * from "./porcelain.js";
9
+ export * from "./signal/fn.js";
10
+ export * from "./signal/class.js";
10
11
  export * from "./types.js";
@@ -1,11 +1,12 @@
1
- export * from "./core/parts/reactive.js";
2
- export * from "./core/parts/readable.js";
3
- export * from "./core/derived.js";
4
- export * from "./core/effect.js";
5
- export * from "./core/lazy.js";
6
- export * from "./core/signal.js";
1
+ export * from "./derived/fn.js";
2
+ export * from "./derived/class.js";
3
+ export * from "./effect/effect.js";
4
+ export * from "./effect/watch.js";
5
+ export * from "./lazy/fn.js";
6
+ export * from "./lazy/class.js";
7
7
  export * from "./r/map.js";
8
8
  export * from "./r/set.js";
9
- export * from "./porcelain.js";
9
+ export * from "./signal/fn.js";
10
+ export * from "./signal/class.js";
10
11
  export * from "./types.js";
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/signals/index.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAEhC,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAE1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/signals/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAElC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AAEjC,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAE/B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAE1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AAEjC,cAAc,YAAY,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { SignalOptions } from "../types.js";
2
+ import { _collect, _compare, _dirty, _disposers, _effect, _formula } from "../utils/symbols.js";
3
+ export interface Lazy<Value> {
4
+ (): Value;
5
+ }
6
+ export declare class Lazy<Value> {
7
+ sneak: Value;
8
+ [_formula]: () => Value;
9
+ [_dirty]: boolean;
10
+ [_disposers]: (() => void)[];
11
+ [_effect]: (() => void) | undefined;
12
+ [_compare]: (a: any, b: any) => boolean;
13
+ constructor(formula: () => Value, options?: Partial<SignalOptions>);
14
+ get value(): Value;
15
+ [_collect](): Value;
16
+ get(): Value;
17
+ dispose(): void;
18
+ toString(): string;
19
+ }
@@ -0,0 +1,59 @@
1
+ import { lazy } from "./fn.js";
2
+ import { tracker } from "../../tracker/tracker.js";
3
+ import { _collect, _compare, _dirty, _disposers, _effect, _formula } from "../utils/symbols.js";
4
+ export class Lazy {
5
+ sneak;
6
+ [_formula];
7
+ [_dirty];
8
+ [_disposers];
9
+ [_effect];
10
+ [_compare];
11
+ constructor(formula, options) {
12
+ if (new.target !== Lazy)
13
+ throw new Error("Lazy cannot be subclassed");
14
+ return lazy(formula, options);
15
+ }
16
+ get value() {
17
+ return this.get();
18
+ }
19
+ [_collect]() {
20
+ for (const d of this[_disposers])
21
+ d();
22
+ this[_disposers] = [];
23
+ const { seen, result } = tracker.observe(this[_formula]);
24
+ const markDirty = async () => { this[_dirty] = true; };
25
+ for (const saw of seen)
26
+ this[_disposers].push(tracker.subscribe(saw, markDirty));
27
+ this[_effect] = () => {
28
+ for (const d of this[_disposers])
29
+ d();
30
+ this[_disposers] = [];
31
+ };
32
+ return result;
33
+ }
34
+ get() {
35
+ if (!this[_effect]) {
36
+ this.sneak = this[_collect]();
37
+ this[_dirty] = false;
38
+ }
39
+ else if (this[_dirty]) {
40
+ this[_dirty] = false;
41
+ const value = this[_collect]();
42
+ const isChanged = !this[_compare](this.sneak, value);
43
+ if (isChanged) {
44
+ this.sneak = value;
45
+ tracker.notifyWrite(this);
46
+ }
47
+ }
48
+ tracker.notifyRead(this);
49
+ return this.sneak;
50
+ }
51
+ dispose() {
52
+ if (this[_effect])
53
+ this[_effect]();
54
+ }
55
+ toString() {
56
+ return `($lazy "${String(this.get())}")`;
57
+ }
58
+ }
59
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../../s/signals/lazy/class.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAM7F,MAAM,OAAO,IAAI;IAChB,KAAK,CACJ;IAAA,CAAC,QAAQ,CAAC,CACV;IAAA,CAAC,MAAM,CAAC,CACR;IAAA,CAAC,UAAU,CAAC,CACZ;IAAA,CAAC,OAAO,CAAC,CACT;IAAA,CAAC,QAAQ,CAAC,CAA8B;IAEzC,YAAY,OAAoB,EAAE,OAAgC;QACjE,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QACrE,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;IAClB,CAAC;IAED,CAAC,QAAQ,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;YAAE,CAAC,EAAE,CAAA;QACrC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;QAErB,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEtD,MAAM,SAAS,GAAG,KAAK,IAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA,CAAC,CAAC,CAAA;QACpD,KAAK,MAAM,GAAG,IAAI,IAAI;YACrB,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;QAEzD,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE;YACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;gBAAE,CAAC,EAAE,CAAA;YACrC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAA;QACtB,CAAC,CAAA;QAED,OAAO,MAAM,CAAA;IACd,CAAC;IAED,GAAG;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;QACrB,CAAC;aACI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;YAC9B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YACpD,IAAI,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;gBAClB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YAC1B,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxB,OAAO,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,OAAO,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;IACjB,CAAC;IAED,QAAQ;QACP,OAAO,WAAW,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;IACzC,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ import { Lazy } from "./class.js";
2
+ import { SignalOptions } from "../types.js";
3
+ export declare function lazy<Value>(formula: () => Value, options?: Partial<SignalOptions>): Lazy<Value>;
@@ -0,0 +1,17 @@
1
+ import { Lazy } from "./class.js";
2
+ import { defaultCompare } from "../utils/default-compare.js";
3
+ import { _compare, _dirty, _disposers, _effect, _formula } from "../utils/symbols.js";
4
+ export function lazy(formula, options) {
5
+ function fn() {
6
+ return fn.get();
7
+ }
8
+ Object.setPrototypeOf(fn, Lazy.prototype);
9
+ fn.sneak = undefined;
10
+ fn[_formula] = formula;
11
+ fn[_dirty] = false;
12
+ fn[_effect] = undefined;
13
+ fn[_disposers] = [];
14
+ fn[_compare] = options?.compare ?? defaultCompare;
15
+ return fn;
16
+ }
17
+ //# sourceMappingURL=fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.js","sourceRoot":"","sources":["../../../s/signals/lazy/fn.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,YAAY,CAAA;AAE/B,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAEnF,MAAM,UAAU,IAAI,CAAQ,OAAoB,EAAE,OAAgC;IACjF,SAAS,EAAE;QACV,OAAQ,EAAkB,CAAC,GAAG,EAAE,CAAA;IACjC,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,EAAE,CAAC,KAAK,GAAG,SAAS,CAAA;IACpB,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;IACtB,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;IAClB,EAAE,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;IACvB,EAAE,CAAC,UAAU,CAAC,GAAG,EAAS,CAAA;IAC1B,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,CAAA;IAEjD,OAAO,EAAiB,CAAA;AACzB,CAAC"}
@@ -2,9 +2,8 @@ import { Science } from "@e280/science";
2
2
  declare const _default: {
3
3
  "lazy values": Science.Test;
4
4
  "lazy is lazy": Science.Test;
5
+ "lazy handles changing deps": Science.Test;
5
6
  "lazy syntax": Science.Test;
6
- "hipster fns": {
7
- "lazy values": Science.Test;
8
- };
7
+ "lazy hipster syntax": Science.Test;
9
8
  };
10
9
  export default _default;
@@ -1,5 +1,6 @@
1
1
  import { Science, test, expect } from "@e280/science";
2
- import { lazy, signal } from "../porcelain.js";
2
+ import { lazy } from "./fn.js";
3
+ import { signal } from "../signal/fn.js";
3
4
  export default Science.suite({
4
5
  "lazy values": test(async () => {
5
6
  const a = signal(2);
@@ -26,6 +27,17 @@ export default Science.suite({
26
27
  expect(comp.value).is(20);
27
28
  expect(runs).is(2);
28
29
  }),
30
+ "lazy handles changing deps": test(async () => {
31
+ const toggle = signal(true);
32
+ const a = signal(1);
33
+ const b = signal(2);
34
+ const comp = lazy(() => toggle() ? a() : b());
35
+ expect(comp()).is(1);
36
+ await toggle(false);
37
+ expect(comp()).is(2);
38
+ await b(3);
39
+ expect(comp()).is(3);
40
+ }),
29
41
  "lazy syntax": test(async () => {
30
42
  const a = signal(2);
31
43
  const b = signal(3);
@@ -35,17 +47,15 @@ export default Science.suite({
35
47
  expect(sum.value).is(8);
36
48
  expect(sum.get()).is(8);
37
49
  }),
38
- "hipster fns": Science.suite({
39
- "lazy values": test(async () => {
40
- const a = signal(2);
41
- const b = signal(3);
42
- const sum = lazy(() => a() + b());
43
- expect(sum()).is(5);
44
- await a(5);
45
- expect(sum()).is(8);
46
- await b(7);
47
- expect(sum()).is(12);
48
- }),
50
+ "lazy hipster syntax": test(async () => {
51
+ const a = signal(2);
52
+ const b = signal(3);
53
+ const sum = lazy(() => a() + b());
54
+ expect(sum()).is(5);
55
+ await a(5);
56
+ expect(sum()).is(8);
57
+ await b(7);
58
+ expect(sum()).is(12);
49
59
  }),
50
60
  });
51
- //# sourceMappingURL=lazy.test.js.map
61
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../s/signals/lazy/test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAC,MAAM,eAAe,CAAA;AACnD,OAAO,EAAC,IAAI,EAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAA;AAEtC,eAAe,OAAO,CAAC,KAAK,CAAC;IAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACzB,CAAC,CAAC;IAEF,cAAc,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,IAAI,GAAG,CAAC,CAAA;QAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;YACtB,IAAI,EAAE,CAAA;YACN,OAAO,CAAC,CAAC,KAAK,GAAG,EAAE,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzB,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAElB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzB,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC,CAAC;IAEF,4BAA4B,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACpB,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;QACnB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACpB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACV,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC,CAAC;IAEF,aAAa,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxB,CAAC,CAAC;IAEF,qBAAqB,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QACrC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEnB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACV,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEnB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACV,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACrB,CAAC,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { Sub } from "@e280/stz";
2
+ import { SignalOptions } from "../types.js";
3
+ import { _compare, _lock } from "../utils/symbols.js";
4
+ export interface Signal<Value> {
5
+ (): Value;
6
+ (value: Value): Promise<Value>;
7
+ }
8
+ export declare class Signal<Value> {
9
+ sneak: Value;
10
+ on: Sub<[Value]>;
11
+ [_lock]: boolean;
12
+ [_compare]: (a: any, b: any) => boolean;
13
+ constructor(value: Value, options?: Partial<SignalOptions>);
14
+ get value(): any;
15
+ set value(value: any);
16
+ get(): Value;
17
+ set(value: Value, forcePublish?: boolean): Promise<Value>;
18
+ publish(): Promise<Value>;
19
+ toString(): string;
20
+ }
@@ -0,0 +1,57 @@
1
+ import { signal } from "./fn.js";
2
+ import { tracker } from "../../tracker/tracker.js";
3
+ import { _compare, _lock } from "../utils/symbols.js";
4
+ export class Signal {
5
+ sneak;
6
+ on;
7
+ [_lock];
8
+ [_compare];
9
+ constructor(value, options) {
10
+ if (new.target !== Signal)
11
+ throw new Error("Signal cannot be subclassed");
12
+ return signal(value, options);
13
+ }
14
+ get value() {
15
+ return this.get();
16
+ }
17
+ set value(value) {
18
+ void this.set(value);
19
+ }
20
+ get() {
21
+ tracker.notifyRead(this);
22
+ return this.sneak;
23
+ }
24
+ async set(value, forcePublish = false) {
25
+ const previous = this.sneak;
26
+ this.sneak = value;
27
+ if (forcePublish || !this[_compare](previous, value))
28
+ await this.publish();
29
+ return value;
30
+ }
31
+ async publish() {
32
+ // only wizards are allowed beyond this point.
33
+ // - the implementation is subtle
34
+ // - it looks wrong, but it's right
35
+ // - tarnished alchemists, take heed: lock engages only for sync activity of the async fns (think of the value setter!)
36
+ if (this[_lock])
37
+ throw new Error("forbid circularity");
38
+ const value = this.sneak;
39
+ let promise = Promise.resolve();
40
+ try {
41
+ this[_lock] = true;
42
+ promise = Promise.all([
43
+ tracker.notifyWrite(this),
44
+ this.on.pub(value),
45
+ ]);
46
+ }
47
+ finally {
48
+ this[_lock] = false;
49
+ }
50
+ await promise;
51
+ return value;
52
+ }
53
+ toString() {
54
+ return `($signal "${String(this.get())}")`;
55
+ }
56
+ }
57
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../../s/signals/signal/class.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAA;AAE9B,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,qBAAqB,CAAA;AAOnD,MAAM,OAAO,MAAM;IAClB,KAAK,CAAQ;IACb,EAAE,CAED;IAAA,CAAC,KAAK,CAAC,CACP;IAAA,CAAC,QAAQ,CAAC,CAA8B;IAEzC,YAAY,KAAY,EAAE,OAAgC;QACzD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QACzE,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,KAAK;QACR,OAAQ,IAAoB,CAAC,GAAG,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,KAAU;QACnB,KAAM,IAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAED,GAAG;QACF,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxB,OAAO,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAY,EAAE,YAAY,GAAG,KAAK;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC;YACnD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QACrB,OAAO,KAAK,CAAA;IACb,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,8CAA8C;QAC9C,iCAAiC;QACjC,mCAAmC;QACnC,uHAAuH;QAEvH,IAAI,IAAI,CAAC,KAAK,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,IAAI,OAAO,GAAiB,OAAO,CAAC,OAAO,EAAE,CAAA;QAE7C,IAAI,CAAC;YACJ,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YAClB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;gBACrB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACzB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;aAClB,CAAC,CAAA;QACH,CAAC;gBACO,CAAC;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QACpB,CAAC;QAED,MAAM,OAAO,CAAA;QACb,OAAO,KAAK,CAAA;IACb,CAAC;IAED,QAAQ;QACP,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;IAC3C,CAAC;CACD"}
@@ -0,0 +1,7 @@
1
+ import { Signal } from "./class.js";
2
+ import { SignalOptions } from "../types.js";
3
+ export declare function signal<Value>(value: Value, options?: Partial<SignalOptions>): Signal<Value>;
4
+ export declare namespace signal {
5
+ var derived: typeof import("../derived/fn.js").derived;
6
+ var lazy: typeof import("../lazy/fn.js").lazy;
7
+ }
@@ -0,0 +1,23 @@
1
+ import { sub } from "@e280/stz";
2
+ import { Signal } from "./class.js";
3
+ import { lazy } from "../lazy/fn.js";
4
+ import { derived } from "../derived/fn.js";
5
+ import { _compare, _lock } from "../utils/symbols.js";
6
+ import { defaultCompare } from "../utils/default-compare.js";
7
+ export function signal(value, options) {
8
+ function fn(_value) {
9
+ const self = fn;
10
+ return (arguments.length === 0)
11
+ ? self.get()
12
+ : self.set(arguments[0]);
13
+ }
14
+ Object.setPrototypeOf(fn, Signal.prototype);
15
+ fn.sneak = value;
16
+ fn.on = sub();
17
+ fn[_lock] = false;
18
+ fn[_compare] = options?.compare ?? defaultCompare;
19
+ return fn;
20
+ }
21
+ signal.derived = derived;
22
+ signal.lazy = lazy;
23
+ //# sourceMappingURL=fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.js","sourceRoot":"","sources":["../../../s/signals/signal/fn.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,MAAM,EAAC,MAAM,YAAY,CAAA;AACjC,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAA;AAElC,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAA;AAE1D,MAAM,UAAU,MAAM,CAAQ,KAAY,EAAE,OAAgC;IAG3E,SAAS,EAAE,CAAC,MAAc;QACzB,MAAM,IAAI,GAAG,EAAmB,CAAA;QAChC,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACZ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAC3C,EAAE,CAAC,KAAK,GAAG,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,GAAG,GAAG,EAAW,CAAA;IACtB,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;IACjB,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,CAAA;IAEjD,OAAO,EAAmB,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,OAAO,CAAA;AACxB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA"}