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.
- package/all/rmemo/index.d.ts +27 -9
- package/all/rmemo/index.js +23 -13
- package/all/rmemo/index.test.ts +9 -14
- package/package.json +4 -4
package/all/rmemo/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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 }
|
package/all/rmemo/index.js
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
/// <reference types="./index.d.ts" />
|
|
2
|
-
/** @type {
|
|
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 {
|
|
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(
|
|
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 {
|
|
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, ...
|
|
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
|
-
...
|
|
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 {
|
|
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, ...
|
|
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
|
-
...
|
|
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 {
|
|
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(
|
|
171
|
+
return add_def(...arg_a)
|
|
162
172
|
})
|
|
163
173
|
return ()=>{
|
|
164
174
|
rmemo__off(pair[0])
|
package/all/rmemo/index.test.ts
CHANGED
|
@@ -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
|
-
|
|
475
|
-
const
|
|
476
|
-
|
|
477
|
-
|
|
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(
|
|
481
|
-
equal(count, 0)
|
|
479
|
+
equal(add_arg_aa_val_aaa, [])
|
|
482
480
|
base$()
|
|
483
|
-
equal(
|
|
484
|
-
equal(count, 1)
|
|
481
|
+
equal(add_arg_aa_val_aaa, [[[base$, undefined], 1]])
|
|
485
482
|
base$._ = 2
|
|
486
|
-
equal(
|
|
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(
|
|
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.
|
|
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.
|
|
149
|
-
"@types/sinon": "^17.0.
|
|
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
|
+
}
|