@e280/strata 0.2.0-1 → 0.2.0-10

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 (99) hide show
  1. package/README.md +95 -57
  2. package/package.json +4 -4
  3. package/s/signals/core/derived.ts +65 -0
  4. package/s/signals/{effect.ts → core/effect.ts} +1 -1
  5. package/s/signals/{lazy.ts → core/lazy.ts} +34 -3
  6. package/s/signals/{parts → core/parts}/readable.ts +1 -1
  7. package/s/signals/core/signal.ts +97 -0
  8. package/s/signals/index.ts +11 -8
  9. package/s/signals/porcelain.ts +30 -0
  10. package/s/signals/r/map.ts +63 -0
  11. package/s/signals/r/set.ts +43 -0
  12. package/s/signals/signals.test.ts +5 -6
  13. package/s/signals/tests/{derive.test.ts → derived.test.ts} +28 -6
  14. package/s/signals/tests/effect.test.ts +2 -2
  15. package/s/signals/tests/lazy.test.ts +16 -1
  16. package/s/signals/tests/signal.test.ts +53 -1
  17. package/s/signals/types.ts +16 -5
  18. package/s/tests.test.ts +2 -2
  19. package/s/tree/parts/branch.ts +4 -4
  20. package/s/tree/parts/trunk.ts +5 -5
  21. package/s/tree/tree.test.ts +1 -1
  22. package/x/signals/core/derived.d.ts +10 -0
  23. package/x/signals/core/derived.js +52 -0
  24. package/x/signals/core/derived.js.map +1 -0
  25. package/x/signals/{effect.js → core/effect.js} +1 -1
  26. package/x/signals/core/effect.js.map +1 -0
  27. package/x/signals/{lazy.d.ts → core/lazy.d.ts} +4 -1
  28. package/x/signals/{lazy.js → core/lazy.js} +25 -2
  29. package/x/signals/core/lazy.js.map +1 -0
  30. package/x/signals/core/parts/reactive.js.map +1 -0
  31. package/x/signals/{parts → core/parts}/readable.js +1 -1
  32. package/x/signals/core/parts/readable.js.map +1 -0
  33. package/x/signals/{signal.d.ts → core/signal.d.ts} +4 -2
  34. package/x/signals/core/signal.js +76 -0
  35. package/x/signals/core/signal.js.map +1 -0
  36. package/x/signals/index.d.ts +9 -7
  37. package/x/signals/index.js +9 -7
  38. package/x/signals/index.js.map +1 -1
  39. package/x/signals/porcelain.d.ts +8 -0
  40. package/x/signals/porcelain.js +15 -0
  41. package/x/signals/porcelain.js.map +1 -0
  42. package/x/signals/r/map.d.ts +14 -0
  43. package/x/signals/r/map.js +52 -0
  44. package/x/signals/r/map.js.map +1 -0
  45. package/x/signals/r/set.d.ts +10 -0
  46. package/x/signals/r/set.js +36 -0
  47. package/x/signals/r/set.js.map +1 -0
  48. package/x/signals/signals.test.d.ts +26 -17
  49. package/x/signals/signals.test.js +4 -6
  50. package/x/signals/signals.test.js.map +1 -1
  51. package/x/signals/tests/{derive.test.d.ts → derived.test.d.ts} +4 -0
  52. package/x/signals/tests/{derive.test.js → derived.test.js} +25 -7
  53. package/x/signals/tests/derived.test.js.map +1 -0
  54. package/x/signals/tests/effect.test.js +2 -2
  55. package/x/signals/tests/effect.test.js.map +1 -1
  56. package/x/signals/tests/lazy.test.d.ts +3 -0
  57. package/x/signals/tests/lazy.test.js +13 -1
  58. package/x/signals/tests/lazy.test.js.map +1 -1
  59. package/x/signals/tests/signal.test.d.ts +6 -0
  60. package/x/signals/tests/signal.test.js +41 -1
  61. package/x/signals/tests/signal.test.js.map +1 -1
  62. package/x/signals/types.d.ts +14 -5
  63. package/x/tests.test.js +2 -2
  64. package/x/tests.test.js.map +1 -1
  65. package/x/tree/parts/branch.js +2 -2
  66. package/x/tree/parts/branch.js.map +1 -1
  67. package/x/tree/parts/trunk.js +2 -2
  68. package/x/tree/parts/trunk.js.map +1 -1
  69. package/x/tree/tree.test.js +1 -1
  70. package/x/tree/tree.test.js.map +1 -1
  71. package/s/signals/derive.ts +0 -33
  72. package/s/signals/fns.ts +0 -31
  73. package/s/signals/signal.ts +0 -55
  74. package/s/signals/tests/signal-fn.test.ts +0 -28
  75. package/s/signals/utils/hipster.ts +0 -40
  76. package/x/signals/derive.d.ts +0 -7
  77. package/x/signals/derive.js +0 -28
  78. package/x/signals/derive.js.map +0 -1
  79. package/x/signals/effect.js.map +0 -1
  80. package/x/signals/fns.d.ts +0 -12
  81. package/x/signals/fns.js +0 -16
  82. package/x/signals/fns.js.map +0 -1
  83. package/x/signals/lazy.js.map +0 -1
  84. package/x/signals/parts/reactive.js.map +0 -1
  85. package/x/signals/parts/readable.js.map +0 -1
  86. package/x/signals/signal.js +0 -46
  87. package/x/signals/signal.js.map +0 -1
  88. package/x/signals/tests/derive.test.js.map +0 -1
  89. package/x/signals/tests/signal-fn.test.d.ts +0 -6
  90. package/x/signals/tests/signal-fn.test.js +0 -22
  91. package/x/signals/tests/signal-fn.test.js.map +0 -1
  92. package/x/signals/utils/hipster.d.ts +0 -3
  93. package/x/signals/utils/hipster.js +0 -28
  94. package/x/signals/utils/hipster.js.map +0 -1
  95. /package/s/signals/{parts → core/parts}/reactive.ts +0 -0
  96. /package/x/signals/{effect.d.ts → core/effect.d.ts} +0 -0
  97. /package/x/signals/{parts → core/parts}/reactive.d.ts +0 -0
  98. /package/x/signals/{parts → core/parts}/reactive.js +0 -0
  99. /package/x/signals/{parts → core/parts}/readable.d.ts +0 -0
@@ -1,13 +1,23 @@
1
1
 
2
2
  import {Science, test, expect, spy} from "@e280/science"
3
- import {effect} from "../effect.js"
4
- import {derive, signal} from "../fns.js"
3
+ import {effect} from "../core/effect.js"
4
+ import {derived, signal} from "../porcelain.js"
5
5
 
6
6
  export default Science.suite({
7
+ "basic": test(async() => {
8
+ const a = signal(1)
9
+ const b = signal(10)
10
+ const product = derived(() => a.get() * b.get())
11
+ expect(product.get()).is(10)
12
+
13
+ await a.set(2)
14
+ expect(product.get()).is(20)
15
+ }),
16
+
7
17
  "effect reacts to derived changes": test(async() => {
8
18
  const a = signal(1)
9
19
  const b = signal(10)
10
- const product = derive(() => a.value * b.value)
20
+ const product = derived(() => a.value * b.value)
11
21
 
12
22
  let mutations = 0
13
23
  effect(() => {
@@ -29,7 +39,7 @@ export default Science.suite({
29
39
  "effect doesn't overreact to derived": test(async() => {
30
40
  const a = signal(1)
31
41
  const b = signal(10)
32
- const product = signal.derive(() => a.value * b.value)
42
+ const product = signal.derived(() => a.value * b.value)
33
43
 
34
44
  const derivedSpy = spy(() => {})
35
45
  product.on(derivedSpy)
@@ -53,7 +63,7 @@ export default Science.suite({
53
63
  "derived.on": test(async() => {
54
64
  const a = signal(1)
55
65
  const b = signal(10)
56
- const product = signal.derive(() => a.value * b.value)
66
+ const product = signal.derived(() => a.value * b.value)
57
67
  expect(product.value).is(10)
58
68
 
59
69
  const mole = spy((_v: number) => {})
@@ -69,7 +79,7 @@ export default Science.suite({
69
79
  "derived.on not called if result doesn't change": test(async() => {
70
80
  const a = signal(1)
71
81
  const b = signal(10)
72
- const product = signal.derive(() => a.value * b.value)
82
+ const product = signal.derived(() => a.value * b.value)
73
83
  expect(product.value).is(10)
74
84
 
75
85
  const mole = spy((_v: number) => {})
@@ -85,5 +95,17 @@ export default Science.suite({
85
95
  expect(product.value).is(20)
86
96
  expect(mole.spy.calls.length).is(1)
87
97
  }),
98
+
99
+ "hipster fns": Science.suite({
100
+ "basic": test(async() => {
101
+ const a = signal(1)
102
+ const b = signal(10)
103
+ const product = derived(() => a() * b())
104
+ expect(product()).is(10)
105
+
106
+ await a(2)
107
+ expect(product()).is(20)
108
+ }),
109
+ }),
88
110
  })
89
111
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  import {Science, test, expect} from "@e280/science"
3
- import {signal} from "../fns.js"
4
- import {effect} from "../effect.js"
3
+ import {signal} from "../porcelain.js"
4
+ import {effect} from "../core/effect.js"
5
5
 
6
6
  export default Science.suite({
7
7
  "tracks signal changes": test(async() => {
@@ -1,6 +1,6 @@
1
1
 
2
2
  import {Science, test, expect} from "@e280/science"
3
- import {lazy, signal} from "../fns.js"
3
+ import {lazy, signal} from "../porcelain.js"
4
4
 
5
5
  export default Science.suite({
6
6
  "lazy values": test(async() => {
@@ -45,5 +45,20 @@ export default Science.suite({
45
45
  expect(sum.value).is(8)
46
46
  expect(sum.get()).is(8)
47
47
  }),
48
+
49
+ "hipster fns": Science.suite({
50
+ "lazy values": test(async() => {
51
+ const a = signal(2)
52
+ const b = signal(3)
53
+ const sum = lazy(() => a() + b())
54
+ expect(sum()).is(5)
55
+
56
+ await a(5)
57
+ expect(sum()).is(8)
58
+
59
+ await b(7)
60
+ expect(sum()).is(12)
61
+ }),
62
+ }),
48
63
  })
49
64
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  import {Science, test, expect} from "@e280/science"
3
- import {signal} from "../fns.js"
3
+ import {signal} from "../porcelain.js"
4
4
 
5
5
  export default Science.suite({
6
6
  "get/set value": test(async() => {
@@ -59,5 +59,57 @@ export default Science.suite({
59
59
  expect(runs).is(0)
60
60
  }),
61
61
  }),
62
+
63
+ "hipster syntax": Science.suite({
64
+ "get and set": test(async() => {
65
+ const count = signal(0)
66
+ expect(count()).is(0)
67
+
68
+ count(count() + 1)
69
+ expect(count()).is(1)
70
+ }),
71
+
72
+ "old get and set still work": test(async() => {
73
+ const count = signal(0)
74
+ expect(count.get()).is(0)
75
+
76
+ count.set(count.get() + 1)
77
+ expect(count.get()).is(1)
78
+ }),
79
+
80
+ "interop": test(async() => {
81
+ const count = signal(0)
82
+
83
+ count(1)
84
+ expect(count()).is(1)
85
+ expect(count.get()).is(1)
86
+ expect(count.value).is(1)
87
+
88
+ count.set(2)
89
+ expect(count()).is(2)
90
+ expect(count.get()).is(2)
91
+ expect(count.value).is(2)
92
+
93
+ count.value = 3
94
+ expect(count()).is(3)
95
+ expect(count.get()).is(3)
96
+ expect(count.value).is(3)
97
+ }),
98
+
99
+ ".on 'this' interrogation": test(async() => {
100
+ const count = signal(0)
101
+ expect(count()).is(0)
102
+
103
+ let reported = count()
104
+ count.on(x => {reported = x})
105
+
106
+ count(1)
107
+ expect(reported).is(1)
108
+
109
+ count.on.clear()
110
+ count(2)
111
+ expect(reported).is(1)
112
+ }),
113
+ }),
62
114
  })
63
115
 
@@ -1,9 +1,10 @@
1
1
 
2
- import {Lazy} from "./lazy.js"
3
- import {Signal} from "./signal.js"
4
- import {Derive} from "./derive.js"
2
+ import {Lazy} from "./core/lazy.js"
3
+ import {Signal} from "./core/signal.js"
4
+ import {Derived} from "./core/derived.js"
5
5
 
6
- export type Signaly<V> = Signal<V> | Derive<V> | Lazy<V>
6
+ export type Signaly<V> = Signal<V> | Derived<V> | Lazy<V>
7
+ export type SignalyFn<V> = SignalFn<V> | DerivedFn<V> | LazyFn<V>
7
8
 
8
9
  export type SignalOptions = {
9
10
  compare: (a: any, b: any) => boolean
@@ -14,6 +15,16 @@ export type SignalFn<V> = {
14
15
  (v: V): Promise<V>
15
16
  (v?: V): V | Promise<V>
16
17
 
17
- signal: Signal<V>
18
+ core: Signal<V>
18
19
  } & Signal<V>
19
20
 
21
+ export type LazyFn<V> = {
22
+ (): V
23
+ core: Lazy<V>
24
+ } & Lazy<V>
25
+
26
+ export type DerivedFn<V> = {
27
+ (): V
28
+ core: Derived<V>
29
+ } & Derived<V>
30
+
package/s/tests.test.ts CHANGED
@@ -5,8 +5,8 @@ import tree from "./tree/tree.test.js"
5
5
  import signals from "./signals/signals.test.js"
6
6
  import tracker from "./tracker/tracker.test.js"
7
7
 
8
- import {signal} from "./signals/fns.js"
9
- import {effect} from "./signals/effect.js"
8
+ import {signal} from "./signals/porcelain.js"
9
+ import {effect} from "./signals/core/effect.js"
10
10
  import {Trunk} from "./tree/parts/trunk.js"
11
11
 
12
12
  await Science.run({
@@ -1,11 +1,11 @@
1
1
 
2
2
  import {deep} from "@e280/stz"
3
- import {derive} from "../../signals/fns.js"
4
- import {Derive} from "../../signals/derive.js"
3
+ import {derived} from "../../signals/porcelain.js"
4
+ import {Derived} from "../../signals/core/derived.js"
5
5
  import {Branchstate, Immutable, Mutator, Options, Selector, Tree} from "./types.js"
6
6
 
7
7
  export class Branch<S extends Branchstate, ParentState extends Branchstate = any> implements Tree<S> {
8
- #immutable: Derive<Immutable<S>>
8
+ #immutable: Derived<Immutable<S>>
9
9
 
10
10
  constructor(
11
11
  private parent: Tree<ParentState>,
@@ -13,7 +13,7 @@ export class Branch<S extends Branchstate, ParentState extends Branchstate = any
13
13
  private options: Options,
14
14
  ) {
15
15
 
16
- this.#immutable = derive(() => {
16
+ this.#immutable = derived(() => {
17
17
  const state = selector(parent.state as any)
18
18
  return deep.freeze(options.clone(state)) as Immutable<S>
19
19
  }, {compare: deep.equal})
@@ -1,10 +1,10 @@
1
1
 
2
2
  import {deep} from "@e280/stz"
3
3
  import {Branch} from "./branch.js"
4
- import {signal} from "../../signals/fns.js"
4
+ import {signal} from "../../signals/porcelain.js"
5
5
  import {trunkSetup} from "./utils/setup.js"
6
- import {Derive} from "../../signals/derive.js"
7
- import {Signal} from "../../signals/signal.js"
6
+ import {Derived} from "../../signals/core/derived.js"
7
+ import {Signal} from "../../signals/core/signal.js"
8
8
  import {Chronobranch} from "./chronobranch.js"
9
9
  import {processOptions} from "./utils/process-options.js"
10
10
  import {Branchstate, Chronicle, Immutable, Mutator, Options, Selector, Tree, Trunkstate} from "./types.js"
@@ -19,14 +19,14 @@ export class Trunk<S extends Trunkstate> implements Tree<S> {
19
19
 
20
20
  options: Options
21
21
 
22
- #immutable: Derive<Immutable<S>>
22
+ #immutable: Derived<Immutable<S>>
23
23
  #mutable: Signal<S>
24
24
  #mutationLock = 0
25
25
 
26
26
  constructor(state: S, options: Partial<Options> = {}) {
27
27
  this.options = processOptions(options)
28
28
  this.#mutable = signal(state)
29
- this.#immutable = signal.derive(() =>
29
+ this.#immutable = signal.derived(() =>
30
30
  deep.freeze(this.options.clone(this.#mutable.get())) as Immutable<S>
31
31
  )
32
32
  }
@@ -3,7 +3,7 @@ import {nap} from "@e280/stz"
3
3
  import {Science, expect} from "@e280/science"
4
4
 
5
5
  import {Trunk} from "./parts/trunk.js"
6
- import {effect} from "../signals/effect.js"
6
+ import {effect} from "../signals/core/effect.js"
7
7
 
8
8
  export default Science.suite({
9
9
  "trunk": Science.suite({
@@ -0,0 +1,10 @@
1
+ import { Reactive } from "./parts/reactive.js";
2
+ import { DerivedFn, SignalOptions } from "../types.js";
3
+ export declare class Derived<V> extends Reactive<V> {
4
+ #private;
5
+ constructor(formula: () => V, options?: Partial<SignalOptions>);
6
+ toString(): string;
7
+ dispose(): void;
8
+ get core(): this;
9
+ fn(): DerivedFn<V>;
10
+ }
@@ -0,0 +1,52 @@
1
+ import { collectorEffect } from "./effect.js";
2
+ import { Reactive } from "./parts/reactive.js";
3
+ import { tracker } from "../../tracker/tracker.js";
4
+ import { defaultCompare } from "../utils/default-compare.js";
5
+ export class Derived extends Reactive {
6
+ #dispose;
7
+ constructor(formula, options) {
8
+ const compare = options?.compare ?? defaultCompare;
9
+ const { result, dispose } = collectorEffect(formula, async () => {
10
+ const value = formula();
11
+ const isChanged = !compare(this.sneak, value);
12
+ if (isChanged) {
13
+ this.sneak = value;
14
+ await Promise.all([
15
+ tracker.notifyWrite(this),
16
+ this.on.pub(value),
17
+ ]);
18
+ }
19
+ });
20
+ super(result);
21
+ this.#dispose = dispose;
22
+ }
23
+ toString() {
24
+ return `(derived "${String(this.get())}")`;
25
+ }
26
+ dispose() {
27
+ super.dispose();
28
+ this.#dispose();
29
+ }
30
+ get core() {
31
+ return this;
32
+ }
33
+ fn() {
34
+ const that = this;
35
+ function f() {
36
+ return that.get();
37
+ }
38
+ f.core = that;
39
+ f.get = that.get.bind(that);
40
+ f.on = that.on;
41
+ f.dispose = that.dispose.bind(that);
42
+ f.fn = that.fn.bind(that);
43
+ Object.defineProperty(f, "value", {
44
+ get: () => that.value,
45
+ });
46
+ Object.defineProperty(f, "sneak", {
47
+ get: () => that.sneak,
48
+ });
49
+ return f;
50
+ }
51
+ }
52
+ //# sourceMappingURL=derived.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived.js","sourceRoot":"","sources":["../../../s/signals/core/derived.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAA;AAE1D,MAAM,OAAO,OAAW,SAAQ,QAAW;IAC1C,QAAQ,CAAY;IAEpB,YAAY,OAAgB,EAAE,OAAgC;QAC7D,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,CAAA;QAClD,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,IAAG,EAAE;YAC5D,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;YACvB,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAC7C,IAAI,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;gBAClB,MAAM,OAAO,CAAC,GAAG,CAAC;oBACjB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;oBACzB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;iBAClB,CAAC,CAAA;YACH,CAAC;QACF,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,MAAM,CAAC,CAAA;QACb,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,QAAQ;QACP,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;IAC3C,CAAC;IAED,OAAO;QACN,KAAK,CAAC,OAAO,EAAE,CAAA;QACf,IAAI,CAAC,QAAQ,EAAE,CAAA;IAChB,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,EAAE;QACD,MAAM,IAAI,GAAG,IAAkB,CAAA;QAE/B,SAAS,CAAC;YACT,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;QAClB,CAAC;QAED,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;QACb,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QACd,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEzB,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;QAEF,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;QAEF,OAAO,CAAiB,CAAA;IACzB,CAAC;CACD"}
@@ -1,5 +1,5 @@
1
1
  import { debounce } from "@e280/stz";
2
- import { tracker } from "../tracker/tracker.js";
2
+ import { tracker } from "../../tracker/tracker.js";
3
3
  export function effect(collector, responder = collector) {
4
4
  return collectorEffect(collector, responder).dispose;
5
5
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../../../s/signals/core/effect.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAA;AAClC,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAEhD,MAAM,UAAU,MAAM,CACpB,SAAqB,EACrB,YAAwB,SAAS;IAGlC,OAAO,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAkB,EAClB,YAAwB,SAAS;IAGlC,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACjD,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAEjC,MAAM,SAAS,GAAmB,EAAE,CAAA;IACpC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAEjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC1C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,EAAC,MAAM,EAAE,OAAO,EAAC,CAAA;AACzB,CAAC"}
@@ -1,8 +1,11 @@
1
- import { SignalOptions } from "./types.js";
2
1
  import { Readable } from "./parts/readable.js";
2
+ import { LazyFn, SignalOptions } from "../types.js";
3
3
  export declare class Lazy<V> extends Readable<V> {
4
4
  #private;
5
5
  constructor(formula: () => V, options?: Partial<SignalOptions>);
6
+ toString(): string;
6
7
  get(): V;
7
8
  dispose(): void;
9
+ get core(): this;
10
+ fn(): LazyFn<V>;
8
11
  }
@@ -1,7 +1,7 @@
1
1
  import { collectorEffect } from "./effect.js";
2
2
  import { Readable } from "./parts/readable.js";
3
- import { tracker } from "../tracker/tracker.js";
4
- import { defaultCompare } from "./utils/default-compare.js";
3
+ import { tracker } from "../../tracker/tracker.js";
4
+ import { defaultCompare } from "../utils/default-compare.js";
5
5
  export class Lazy extends Readable {
6
6
  #formula;
7
7
  #compare;
@@ -12,6 +12,9 @@ export class Lazy extends Readable {
12
12
  this.#formula = formula;
13
13
  this.#compare = options?.compare ?? defaultCompare;
14
14
  }
15
+ toString() {
16
+ return `($lazy "${String(this.get())}")`;
17
+ }
15
18
  get() {
16
19
  if (!this.#effect) {
17
20
  const { result, dispose } = collectorEffect(this.#formula, () => this.#dirty = true);
@@ -33,5 +36,25 @@ export class Lazy extends Readable {
33
36
  if (this.#effect)
34
37
  this.#effect();
35
38
  }
39
+ get core() {
40
+ return this;
41
+ }
42
+ fn() {
43
+ const that = this;
44
+ function f() {
45
+ return that.get();
46
+ }
47
+ f.core = that;
48
+ f.get = that.get.bind(that);
49
+ f.dispose = that.dispose.bind(that);
50
+ f.fn = that.fn.bind(that);
51
+ Object.defineProperty(f, "value", {
52
+ get: () => that.value,
53
+ });
54
+ Object.defineProperty(f, "sneak", {
55
+ get: () => that.sneak,
56
+ });
57
+ return f;
58
+ }
36
59
  }
37
60
  //# sourceMappingURL=lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../../s/signals/core/lazy.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAA;AAE1D,MAAM,OAAO,IAAQ,SAAQ,QAAW;IACvC,QAAQ,CAAS;IACjB,QAAQ,CAA6B;IACrC,MAAM,GAAG,KAAK,CAAA;IACd,OAAO,CAA0B;IAEjC,YAAY,OAAgB,EAAE,OAAgC;QAC7D,KAAK,CAAC,SAAgB,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,CAAA;IACnD,CAAC;IAED,QAAQ;QACP,OAAO,WAAW,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;IACzC,CAAC;IAED,GAAG;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,GAAG,eAAe,CACxC,IAAI,CAAC,QAAQ,EACb,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CACxB,CAAA;YACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;YACtB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YAEnB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YACzB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;gBACd,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YAC1B,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,EAAE,CAAA;IACnB,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,OAAO;YACf,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,EAAE;QACD,MAAM,IAAI,GAAG,IAAe,CAAA;QAE5B,SAAS,CAAC;YACT,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;QAClB,CAAC;QAED,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;QACb,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEzB,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;QAEF,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;SACrB,CAAC,CAAA;QAEF,OAAO,CAAc,CAAA;IACtB,CAAC;CACD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../../../s/signals/core/parts/reactive.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAA;AAEtC,MAAM,OAAO,QAAY,SAAQ,QAAW;IAC3C,EAAE,GAAG,GAAG,EAAO,CAAA;IAEf,OAAO;QACN,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;CACD"}
@@ -1,4 +1,4 @@
1
- import { tracker } from "../../tracker/tracker.js";
1
+ import { tracker } from "../../../tracker/tracker.js";
2
2
  export class Readable {
3
3
  sneak;
4
4
  constructor(sneak) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readable.js","sourceRoot":"","sources":["../../../../s/signals/core/parts/readable.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,6BAA6B,CAAA;AAEnD,MAAM,OAAO,QAAQ;IACD;IAAnB,YAAmB,KAAQ;QAAR,UAAK,GAAL,KAAK,CAAG;IAAG,CAAC;IAE/B,GAAG;QACF,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACxB,OAAO,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;IAClB,CAAC;CACD"}
@@ -1,11 +1,13 @@
1
- import { SignalOptions } from "./types.js";
2
1
  import { Reactive } from "./parts/reactive.js";
2
+ import { SignalFn, SignalOptions } from "../types.js";
3
3
  export declare class Signal<V> extends Reactive<V> {
4
4
  #private;
5
5
  constructor(value: V, options?: Partial<SignalOptions>);
6
+ toString(): string;
6
7
  set(v: V): Promise<V>;
7
8
  get value(): V;
8
9
  set value(v: V);
9
10
  publish(v?: V): Promise<V>;
10
- fn(): import("./types.js").SignalFn<V>;
11
+ get core(): this;
12
+ fn(): SignalFn<V>;
11
13
  }
@@ -0,0 +1,76 @@
1
+ import { Reactive } from "./parts/reactive.js";
2
+ import { tracker } from "../../tracker/tracker.js";
3
+ import { defaultCompare } from "../utils/default-compare.js";
4
+ export class Signal extends Reactive {
5
+ #lock = false;
6
+ #compare;
7
+ constructor(value, options) {
8
+ super(value);
9
+ this.#compare = options?.compare ?? defaultCompare;
10
+ }
11
+ toString() {
12
+ return `($signal "${String(this.get())}")`;
13
+ }
14
+ async set(v) {
15
+ const isChanged = !this.#compare(this.sneak, v);
16
+ if (isChanged)
17
+ await this.publish(v);
18
+ return v;
19
+ }
20
+ get value() {
21
+ return this.get();
22
+ }
23
+ set value(v) {
24
+ void this.set(v);
25
+ }
26
+ async publish(v = this.sneak) {
27
+ // only wizards are allowed beyond this point.
28
+ // - the implementation is subtle
29
+ // - it looks wrong, but it's right
30
+ // - tarnished alchemists, take heed: lock engages only for sync activity of the async fns (think of the value setter!)
31
+ if (this.#lock)
32
+ throw new Error("forbid circularity");
33
+ let promise = Promise.resolve();
34
+ try {
35
+ this.#lock = true;
36
+ this.sneak = v;
37
+ promise = Promise.all([
38
+ tracker.notifyWrite(this),
39
+ this.on.publish(v),
40
+ ]);
41
+ }
42
+ finally {
43
+ this.#lock = false;
44
+ }
45
+ await promise;
46
+ return v;
47
+ }
48
+ get core() {
49
+ return this;
50
+ }
51
+ fn() {
52
+ const that = this;
53
+ function f(_v) {
54
+ return (arguments.length === 0)
55
+ ? that.get()
56
+ : that.set(arguments[0]);
57
+ }
58
+ f.core = that;
59
+ f.get = that.get.bind(that);
60
+ f.set = that.set.bind(that);
61
+ f.on = that.on;
62
+ f.dispose = that.dispose.bind(that);
63
+ f.publish = that.publish.bind(that);
64
+ f.fn = that.fn.bind(that);
65
+ Object.defineProperty(f, "value", {
66
+ get: () => that.value,
67
+ set: (v) => that.value = v,
68
+ });
69
+ Object.defineProperty(f, "sneak", {
70
+ get: () => that.sneak,
71
+ set: (v) => that.sneak = v,
72
+ });
73
+ return f;
74
+ }
75
+ }
76
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../s/signals/core/signal.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAA;AAEhD,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAA;AAE1D,MAAM,OAAO,MAAU,SAAQ,QAAW;IACzC,KAAK,GAAG,KAAK,CAAA;IACb,QAAQ,CAA6B;IAErC,YAAY,KAAQ,EAAE,OAAgC;QACrD,KAAK,CAAC,KAAK,CAAC,CAAA;QACZ,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,IAAI,cAAc,CAAA;IACnD,CAAC;IAED,QAAQ;QACP,OAAO,aAAa,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,CAAI;QACb,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAC/C,IAAI,SAAS;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACpC,OAAO,CAAC,CAAA;IACT,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,CAAI;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;QAC3B,8CAA8C;QAC9C,iCAAiC;QACjC,mCAAmC;QACnC,uHAAuH;QAEvH,IAAI,IAAI,CAAC,KAAK;YACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAEtC,IAAI,OAAO,GAAiB,OAAO,CAAC,OAAO,EAAE,CAAA;QAE7C,IAAI,CAAC;YACJ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;YACd,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;gBACrB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACzB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;aAClB,CAAC,CAAA;QACH,CAAC;gBACO,CAAC;YACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QACnB,CAAC;QAED,MAAM,OAAO,CAAA;QACb,OAAO,CAAC,CAAA;IACT,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,EAAE;QACD,MAAM,IAAI,GAAG,IAAiB,CAAA;QAI9B,SAAS,CAAC,CAAC,EAAM;YAChB,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACZ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QAED,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;QACb,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QACd,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEzB,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;YACrB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;SAC1B,CAAC,CAAA;QAEF,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;YACrB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;SAC1B,CAAC,CAAA;QAEF,OAAO,CAAgB,CAAA;IACxB,CAAC;CACD"}
@@ -1,8 +1,10 @@
1
- export * from "./parts/reactive.js";
2
- export * from "./parts/readable.js";
3
- export * from "./derive.js";
4
- export * from "./effect.js";
5
- export * from "./fns.js";
6
- export * from "./lazy.js";
7
- export * from "./signal.js";
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";
7
+ export * from "./r/map.js";
8
+ export * from "./r/set.js";
9
+ export * from "./porcelain.js";
8
10
  export * from "./types.js";
@@ -1,9 +1,11 @@
1
- export * from "./parts/reactive.js";
2
- export * from "./parts/readable.js";
3
- export * from "./derive.js";
4
- export * from "./effect.js";
5
- export * from "./fns.js";
6
- export * from "./lazy.js";
7
- export * from "./signal.js";
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";
7
+ export * from "./r/map.js";
8
+ export * from "./r/set.js";
9
+ export * from "./porcelain.js";
8
10
  export * from "./types.js";
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/signals/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
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"}
@@ -0,0 +1,8 @@
1
+ import { SignalOptions } from "./types.js";
2
+ export declare function lazy<V>(formula: () => V, options?: Partial<SignalOptions>): import("./types.js").LazyFn<V>;
3
+ export declare function derived<V>(formula: () => V, options?: Partial<SignalOptions>): import("./types.js").DerivedFn<V>;
4
+ export declare function signal<V>(value: V, options?: Partial<SignalOptions>): import("./types.js").SignalFn<V>;
5
+ export declare namespace signal {
6
+ var lazy: typeof import("./porcelain.js").lazy;
7
+ var derived: typeof import("./porcelain.js").derived;
8
+ }
@@ -0,0 +1,15 @@
1
+ import { Lazy } from "./core/lazy.js";
2
+ import { Signal } from "./core/signal.js";
3
+ import { Derived } from "./core/derived.js";
4
+ export function lazy(formula, options) {
5
+ return new Lazy(formula, options).fn();
6
+ }
7
+ export function derived(formula, options) {
8
+ return new Derived(formula, options).fn();
9
+ }
10
+ export function signal(value, options) {
11
+ return new Signal(value, options).fn();
12
+ }
13
+ signal.lazy = lazy;
14
+ signal.derived = derived;
15
+ //# sourceMappingURL=porcelain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"porcelain.js","sourceRoot":"","sources":["../../s/signals/porcelain.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAC,OAAO,EAAC,MAAM,mBAAmB,CAAA;AAEzC,MAAM,UAAU,IAAI,CAClB,OAAgB,EAChB,OAAgC;IAEjC,OAAO,IAAI,IAAI,CAAI,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,OAAgB,EAChB,OAAgC;IAEjC,OAAO,IAAI,OAAO,CAAI,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,KAAQ,EACR,OAAgC;IAEjC,OAAO,IAAI,MAAM,CAAI,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;AAClB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { MapG } from "@e280/stz";
2
+ export declare class RMap<K, V> extends MapG<K, V> {
3
+ get size(): number;
4
+ [Symbol.iterator](): MapIterator<[K, V]>;
5
+ keys(): MapIterator<K>;
6
+ values(): MapIterator<V>;
7
+ entries(): MapIterator<[K, V]>;
8
+ forEach(callbackFn: (value: V, key: K, map: Map<K, V>) => void): void;
9
+ has(key: K): boolean;
10
+ get(key: K): V | undefined;
11
+ set(key: K, value: V): this;
12
+ delete(key: K): boolean;
13
+ clear(): void;
14
+ }