ctx-core 5.16.1 → 5.16.2

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.
@@ -5,26 +5,37 @@ export declare function memosig_<val_T>(def:memo_def_T<val_T>):sig_T<val_T>
5
5
  export declare function lock_memosig_<val_T>(def:memo_def_T<val_T>):sig_T<val_T>
6
6
  export declare function rmemo__on(rmemo:rmemo_T<unknown>):void
7
7
  export declare function rmemo__off(rmemo:rmemo_T<unknown>):void
8
- export declare function rmemo__add(rmemo:rmemo_T<unknown>, listener:()=>unknown):()=>void
8
+ export declare function rmemo__add<val_T, listener_val_T>(
9
+ rmemo:rmemo_T<val_T>,
10
+ listener:(sig:sig_T<val_T>, prev_val:listener_val_T|undefined)=>listener_val_T
11
+ ):()=>void
9
12
  export type rmemo_T<val_T> = memo_T<val_T>|sig_T<val_T>|lock_memosig_T<val_T>
10
13
  export type circular_rmemo_T = circular_memo_T|circular_sig_T|circular_lock_memosig_T
11
14
  export type memo_T<val_T> = (()=>val_T)&{
12
15
  readonly _:val_T
16
+ readonly a?:rmemo_a_T[]
17
+ readonly f?:rmemo_f_T
18
+ readonly memor:rmemo_r_T[]
19
+ readonly r?:rmemo_r_T
13
20
  readonly val:val_T
14
- r?:WeakRef<()=>val_T>
15
- memor:WeakRef<()=>val_T>[]
16
- a?:rmemo_a_T[]
17
- add<add_val_T>(add_def:(sig:sig_T<val_T>, prev_val:add_val_T|undefined)=>add_val_T):memo_T<val_T>
21
+ add<add_val_T>(add_def:rmemo_add_def_T<val_T, add_val_T>):memo_T<val_T>
22
+ memo_<_val_T>(def:memo_def_T<_val_T>):memo_T<_val_T>
18
23
  }
19
24
  export interface circular_memo_T extends memo_T<circular_memo_T> {
20
25
  }
21
26
  export type sig_T<val_T> = (()=>val_T)&{
22
27
  _:val_T
28
+ readonly a?:rmemo_a_T[]
29
+ readonly f?:(()=>void)&{
30
+ readonly l:number
31
+ readonly s:rmemo_T<unknown>[]
32
+ readonly S:rmemo_T<unknown>[]
33
+ }
34
+ readonly memor:rmemo_r_T[]
35
+ readonly r?:rmemo_r_T
23
36
  readonly val:val_T
24
- r?:WeakRef<()=>val_T>
25
- memor:WeakRef<()=>val_T>[]
26
- a?:rmemo_a_T[]
27
- add<add_val_T>(fn:(sig:sig_T<val_T>, prev_val:add_val_T|undefined)=>add_val_T):sig_T<val_T>
37
+ add<add_val_T>(fn:rmemo_add_def_T<val_T, add_val_T>):sig_T<val_T>
38
+ memo_<_val_T>(def:memo_def_T<_val_T>):memo_T<_val_T>
28
39
  }
29
40
  export interface circular_sig_T extends sig_T<circular_sig_T> {
30
41
  }
@@ -39,3 +50,10 @@ export type rmemo_val_T<sig_T> = sig_T extends { ():infer val_T }
39
50
  export type memo_def_T<val_T> = (sig:sig_T<val_T>)=>val_T
40
51
  export type rmemo_a_T = [memo_T<unknown>, unknown]
41
52
  export type rmemo_add_T<val_T, SV> = (sig:sig_T<val_T>, old_val:SV|undefined)=>SV
53
+ export type rmemo_add_def_T<val_T, add_val_T> = (sig:sig_T<val_T>, prev_val:add_val_T|undefined)=>add_val_T
54
+ export type rmemo_f_T = (()=>void)&{
55
+ readonly l:number
56
+ readonly s:rmemo_T<unknown>[]
57
+ readonly S:rmemo_T<unknown>[]
58
+ }
59
+ export type rmemo_r_T = WeakRef<rmemo_f_T>&{ readonly d?: ()=>rmemo_f_T }
@@ -1,21 +1,26 @@
1
1
  /// <reference types="./index.d.ts" />
2
- /** @type {WeakRef<memo_T>} */
2
+ /** @type {memo_T} */
3
3
  let cur_memo
4
- /** @type {Set<()=>unknown>} */
4
+ /** @type {Set<(()=>unknown)&{ l:number }>} */
5
5
  let queue = new Set
6
6
  /**
7
7
  * @param {memo_def_T}memo_def
8
- * @param {rmemo_add_T<unknown>[]}add_def_a
8
+ * @param {rmemo_add_def_T}add_def_a
9
9
  * @returns {memo_T}
10
10
  * @private
11
11
  */
12
12
  export function memo_(memo_def, ...add_def_a) {
13
+ /** @type {memo_T} */
13
14
  let memo = ()=>{
14
15
  if (!('val' in memo)) {
15
16
  memo.f()
16
17
  }
17
18
  if (cur_memo) {
18
- if (!memo.memor.includes(cur_memo.r ||= new WeakRef(cur_memo.f))) memo.memor.push(cur_memo.r)
19
+ if (!memo.memor.includes(
20
+ cur_memo.r ||= new WeakRef(cur_memo.f)
21
+ )) {
22
+ memo.memor.push(cur_memo.r)
23
+ }
19
24
  if (cur_memo.f.l < memo.f.l + 1) cur_memo.f.l = memo.f.l + 1
20
25
  // memo is called by cur_memo's conditional execution...next change to memo will notify cur_memo
21
26
  cur_memo.f.s.push(memo)
@@ -53,6 +58,10 @@ export function memo_(memo_def, ...add_def_a) {
53
58
  }
54
59
  },
55
60
  })
61
+ /**
62
+ * @param {rmemo_add_def_T}add_def
63
+ * @returns {memo_T}
64
+ */
56
65
  memo.add = add_def=>{
57
66
  if (memo.a) {
58
67
  let pair = [memo_(()=>pair[1] = add_def(memo, pair[1]))]
@@ -78,20 +87,21 @@ export function memo_(memo_def, ...add_def_a) {
78
87
  memo.f.s = []
79
88
  memo.f.S = []
80
89
  memo.memor = []
90
+ // memo.memo_ = memo_
81
91
  return memo
82
92
  }
83
93
  export { memo_ as memosig_ }
84
94
  /**
85
95
  * @param {memo_def_T}memo_def
86
- * @param {rmemo_add_T<unknown>[]}subscriber_a
96
+ * @param {rmemo_add_def_T}add_def_a
87
97
  * @returns {sig_T}
88
98
  * @private
89
99
  */
90
- export function lock_memosig_(memo_def, ...subscriber_a) {
100
+ export function lock_memosig_(memo_def, ...add_def_a) {
91
101
  let lock_memosig = new Proxy(
92
102
  /** @type {sig_T} */memo_(memo=>
93
103
  memo.lock ? memo._ : memo_def(memo),
94
- ...subscriber_a),
104
+ ...add_def_a),
95
105
  {
96
106
  get(memo, prop) {
97
107
  if (prop === 'add') {
@@ -114,16 +124,16 @@ export function lock_memosig_(memo_def, ...subscriber_a) {
114
124
  }
115
125
  /**
116
126
  * @param {unknown}init_val
117
- * @param {rmemo_add_T[]}add_a
127
+ * @param {rmemo_add_def_T}add_def_a
118
128
  * @returns {sig_T}
119
129
  * @private
120
130
  */
121
- export function sig_(init_val, ...add_a) {
131
+ export function sig_(init_val, ...add_def_a) {
122
132
  return memo_(sig=>
123
133
  'val' in sig
124
134
  ? sig.val
125
135
  : init_val,
126
- ...add_a)
136
+ ...add_def_a)
127
137
  }
128
138
  /**
129
139
  * Call the rmemo & enable updates from it's parents.
@@ -151,14 +161,14 @@ export function rmemo__off(rmemo) {
151
161
  * The add_def can autosubscribe to any rmemo.
152
162
  * Returns an "off" function which deactivates the reactive add_def & removes the GC binding from the given memo.
153
163
  * @param {rmemo_T}memo
154
- * @param {()=>unknown}add_def
164
+ * @param {rmemo_add_def_T}add_def
155
165
  * @returns {()=>void}
156
166
  */
157
167
  export function rmemo__add(memo, add_def) {
158
168
  let pair
159
- memo.add(()=>{
169
+ memo.add((...arg_a)=>{
160
170
  pair = memo.a[memo.a.length - 1]
161
- return add_def(memo)
171
+ return add_def(...arg_a)
162
172
  })
163
173
  return ()=>{
164
174
  rmemo__off(pair[0])
@@ -4,7 +4,7 @@ import { deepStrictEqual } from 'node:assert'
4
4
  import { test } from 'uvu'
5
5
  import { equal } from 'uvu/assert'
6
6
  import { sleep } from '../sleep/index.js'
7
- import { lock_memosig_, memo_, type memo_T, memosig_, rmemo__off, rmemo__on, rmemo__add, sig_ } from './index.js'
7
+ import { lock_memosig_, memo_, type memo_T, memosig_, rmemo__off, rmemo__on, rmemo__add, sig_, sig_T } from './index.js'
8
8
  test('memo_|static value', ()=>{
9
9
  let count = 0
10
10
  const memo = memo_(()=>{
@@ -471,23 +471,18 @@ test('.rmemo__on + .rmemo__off', ()=>{
471
471
  })
472
472
  test('rmemo__add', ()=>{
473
473
  const base$ = sig_(1)
474
- let count = 0
475
- const subscriber_base_a:number[] = []
476
- const off = rmemo__add(base$, ()=>{
477
- count++
478
- subscriber_base_a.push(base$())
474
+ const add_arg_aa_val_aaa:[[sig_T<number>, string|undefined], number][] = []
475
+ const off = rmemo__add<number, string>(base$, (...arg_a)=>{
476
+ add_arg_aa_val_aaa.push([arg_a, arg_a[0]()])
477
+ return 'val-'+arg_a[0]()
479
478
  })
480
- equal(subscriber_base_a, [])
481
- equal(count, 0)
479
+ equal(add_arg_aa_val_aaa, [])
482
480
  base$()
483
- equal(subscriber_base_a, [1])
484
- equal(count, 1)
481
+ equal(add_arg_aa_val_aaa, [[[base$, undefined], 1]])
485
482
  base$._ = 2
486
- equal(subscriber_base_a, [1, 2])
487
- equal(count, 2)
483
+ equal(add_arg_aa_val_aaa, [[[base$, undefined], 1], [[base$, 'val-1'], 2]])
488
484
  off()
489
485
  base$._ = 3
490
- equal(subscriber_base_a, [1, 2])
491
- equal(count, 2)
486
+ equal(add_arg_aa_val_aaa, [[[base$, undefined], 1], [[base$, 'val-1'], 2]])
492
487
  })
493
488
  test.run()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctx-core",
3
- "version": "5.16.1",
3
+ "version": "5.16.2",
4
4
  "description": "ctx-core core library",
5
5
  "keywords": [
6
6
  "ctx-core",
@@ -145,8 +145,8 @@
145
145
  "@arethetypeswrong/cli": "^0.13.5",
146
146
  "@ctx-core/preprocess": "^0.1.0",
147
147
  "@size-limit/preset-small-lib": "^11.0.1",
148
- "@types/node": "^20.10.7",
149
- "@types/sinon": "^17.0.2",
148
+ "@types/node": "^20.10.8",
149
+ "@types/sinon": "^17.0.3",
150
150
  "c8": "^9.0.0",
151
151
  "check-dts": "^0.7.2",
152
152
  "esbuild": "^0.19.11",
@@ -248,4 +248,4 @@
248
248
  "limit": "116 B"
249
249
  }
250
250
  ]
251
- }
251
+ }