@e280/stz 0.0.0-27 → 0.0.0-29
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/README.md +3 -3
- package/package.json +2 -2
- package/s/defer.ts +2 -2
- package/s/ev.ts +20 -0
- package/s/index.ts +3 -2
- package/s/once.ts +14 -0
- package/s/pubsub.ts +5 -5
- package/s/repeat.ts +25 -0
- package/x/defer.d.ts +2 -2
- package/x/ev.d.ts +6 -0
- package/x/ev.js +10 -0
- package/x/ev.js.map +1 -0
- package/x/index.d.ts +3 -2
- package/x/index.js +3 -2
- package/x/index.js.map +1 -1
- package/x/once.d.ts +1 -0
- package/x/once.js +12 -0
- package/x/once.js.map +1 -0
- package/x/pubsub.d.ts +2 -2
- package/x/pubsub.js +3 -3
- package/x/repeat.d.ts +5 -0
- package/x/repeat.js +23 -0
- package/x/repeat.js.map +1 -0
- package/s/repeatly.ts +0 -19
- package/s/tracker.ts +0 -57
- package/x/repeatly.d.ts +0 -1
- package/x/repeatly.js +0 -16
- package/x/repeatly.js.map +0 -1
- package/x/tracker.d.ts +0 -28
- package/x/tracker.js +0 -48
- package/x/tracker.js.map +0 -1
package/README.md
CHANGED
|
@@ -74,9 +74,9 @@ standard library of environment-agnostic typescript functions we use basically e
|
|
|
74
74
|
sendMessage.clear()
|
|
75
75
|
onMessage.clear()
|
|
76
76
|
|
|
77
|
-
//
|
|
78
|
-
onMessage.
|
|
79
|
-
sendMessage.
|
|
77
|
+
// instead of a 'once' fn we simply await next()
|
|
78
|
+
await onMessage.next()
|
|
79
|
+
await sendMessage.next()
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
<br/>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@e280/stz",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-29",
|
|
4
4
|
"description": "everyday ts fns for everything",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Chase Moskal <chasemoskal@gmail.com>",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@e280/science": "^0.0.5",
|
|
27
|
-
"@types/node": "^24.0
|
|
27
|
+
"@types/node": "^24.1.0",
|
|
28
28
|
"npm-run-all": "^4.1.5",
|
|
29
29
|
"typescript": "^5.8.3"
|
|
30
30
|
},
|
package/s/defer.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
/** a promise which can be resolved from the outside */
|
|
3
|
-
export type Deferred<R> = {
|
|
3
|
+
export type Deferred<R = void> = {
|
|
4
4
|
promise: Promise<R>
|
|
5
5
|
resolve: (result: R) => void
|
|
6
6
|
reject: (reason: any) => void
|
|
@@ -10,7 +10,7 @@ export type Deferred<R> = {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/** returns a deferred promise with exposed resolve and reject fns */
|
|
13
|
-
export function defer<R>(): Deferred<R> {
|
|
13
|
+
export function defer<R = void>(): Deferred<R> {
|
|
14
14
|
let resolve!: (result: R) => void
|
|
15
15
|
let reject!: (reason: any) => void
|
|
16
16
|
|
package/s/ev.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
export type EvFn = (...a: any[]) => void
|
|
3
|
+
|
|
4
|
+
export type EvTarget<N extends string> = {
|
|
5
|
+
addEventListener(name: N, fn: EvFn): void
|
|
6
|
+
removeEventListener(name: N, fn: EvFn): void
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function ev<N extends string>(target: EvTarget<N>, fns: Record<N, EvFn>) {
|
|
10
|
+
const entries = Object.entries(fns) as [N, EvFn][]
|
|
11
|
+
|
|
12
|
+
for (const [name, fn] of entries)
|
|
13
|
+
target.addEventListener(name, fn)
|
|
14
|
+
|
|
15
|
+
return () => {
|
|
16
|
+
for (const [name, fn] of entries)
|
|
17
|
+
target.removeEventListener(name, fn)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
package/s/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ export * from "./dedupe.js"
|
|
|
20
20
|
export * from "./defer.js"
|
|
21
21
|
export * from "./drill.js"
|
|
22
22
|
export * from "./escape-regex.js"
|
|
23
|
+
export * from "./ev.js"
|
|
23
24
|
export * from "./hat.js"
|
|
24
25
|
export * from "./id-counter.js"
|
|
25
26
|
export * from "./is.js"
|
|
@@ -27,10 +28,10 @@ export * from "./loopy.js"
|
|
|
27
28
|
export * from "./map-g.js"
|
|
28
29
|
export * from "./nap.js"
|
|
29
30
|
export * from "./ob.js"
|
|
31
|
+
export * from "./once.js"
|
|
30
32
|
export * from "./pipe.js"
|
|
31
|
-
export * from "./
|
|
33
|
+
export * from "./repeat.js"
|
|
32
34
|
export * from "./pubsub.js"
|
|
33
35
|
export * from "./time.js"
|
|
34
|
-
export * from "./tracker.js"
|
|
35
36
|
export * from "./trash.js"
|
|
36
37
|
|
package/s/once.ts
ADDED
package/s/pubsub.ts
CHANGED
|
@@ -17,8 +17,8 @@ export interface Xub<A extends any[] = []> {
|
|
|
17
17
|
*/
|
|
18
18
|
on(fn: Listener<A>): () => void
|
|
19
19
|
|
|
20
|
-
/**
|
|
21
|
-
|
|
20
|
+
/** wait for the next published value */
|
|
21
|
+
next(): Promise<A>
|
|
22
22
|
|
|
23
23
|
/** wipe all listeners attached to this. */
|
|
24
24
|
clear(): void
|
|
@@ -46,7 +46,7 @@ export function xub<A extends any[] = []>() {
|
|
|
46
46
|
await Promise.all([...set].map(fn => fn(...a)))
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
async function
|
|
49
|
+
async function next() {
|
|
50
50
|
const {promise, resolve} = defer<A>()
|
|
51
51
|
const unsubscribe = sub((...a) => {
|
|
52
52
|
resolve(a)
|
|
@@ -62,13 +62,13 @@ export function xub<A extends any[] = []>() {
|
|
|
62
62
|
sub.pub = pub
|
|
63
63
|
sub.sub = sub
|
|
64
64
|
sub.on = sub
|
|
65
|
-
sub.
|
|
65
|
+
sub.next = next
|
|
66
66
|
sub.clear = clear
|
|
67
67
|
|
|
68
68
|
pub.pub = pub
|
|
69
69
|
pub.sub = sub
|
|
70
70
|
pub.on = sub
|
|
71
|
-
pub.
|
|
71
|
+
pub.next = next
|
|
72
72
|
pub.clear = clear
|
|
73
73
|
|
|
74
74
|
return [pub, sub] as [Pub<A>, Sub<A>]
|
package/s/repeat.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* repeat the given async function over and over.
|
|
4
|
+
* - consider using `nap` in your fn to create a delay
|
|
5
|
+
*/
|
|
6
|
+
export function repeat(fn: (stop: () => void) => Promise<void>) {
|
|
7
|
+
let timeout: any
|
|
8
|
+
let stopped = false
|
|
9
|
+
|
|
10
|
+
const stop = () => {
|
|
11
|
+
stopped = true
|
|
12
|
+
clearTimeout(timeout)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const tick = async() => {
|
|
16
|
+
if (stopped) return
|
|
17
|
+
await fn(stop)
|
|
18
|
+
if (stopped) return
|
|
19
|
+
timeout = setTimeout(tick, 0)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
tick()
|
|
23
|
+
return stop
|
|
24
|
+
}
|
|
25
|
+
|
package/x/defer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** a promise which can be resolved from the outside */
|
|
2
|
-
export type Deferred<R> = {
|
|
2
|
+
export type Deferred<R = void> = {
|
|
3
3
|
promise: Promise<R>;
|
|
4
4
|
resolve: (result: R) => void;
|
|
5
5
|
reject: (reason: any) => void;
|
|
@@ -7,4 +7,4 @@ export type Deferred<R> = {
|
|
|
7
7
|
entangle: (outsidePromise: Promise<R>) => Promise<R>;
|
|
8
8
|
};
|
|
9
9
|
/** returns a deferred promise with exposed resolve and reject fns */
|
|
10
|
-
export declare function defer<R>(): Deferred<R>;
|
|
10
|
+
export declare function defer<R = void>(): Deferred<R>;
|
package/x/ev.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type EvFn = (...a: any[]) => void;
|
|
2
|
+
export type EvTarget<N extends string> = {
|
|
3
|
+
addEventListener(name: N, fn: EvFn): void;
|
|
4
|
+
removeEventListener(name: N, fn: EvFn): void;
|
|
5
|
+
};
|
|
6
|
+
export declare function ev<N extends string>(target: EvTarget<N>, fns: Record<N, EvFn>): () => void;
|
package/x/ev.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function ev(target, fns) {
|
|
2
|
+
const entries = Object.entries(fns);
|
|
3
|
+
for (const [name, fn] of entries)
|
|
4
|
+
target.addEventListener(name, fn);
|
|
5
|
+
return () => {
|
|
6
|
+
for (const [name, fn] of entries)
|
|
7
|
+
target.removeEventListener(name, fn);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ev.js.map
|
package/x/ev.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ev.js","sourceRoot":"","sources":["../s/ev.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,EAAE,CAAmB,MAAmB,EAAE,GAAoB;IAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAgB,CAAA;IAElD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO;QAC/B,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAElC,OAAO,GAAG,EAAE;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO;YAC/B,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACtC,CAAC,CAAA;AACF,CAAC"}
|
package/x/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from "./dedupe.js";
|
|
|
16
16
|
export * from "./defer.js";
|
|
17
17
|
export * from "./drill.js";
|
|
18
18
|
export * from "./escape-regex.js";
|
|
19
|
+
export * from "./ev.js";
|
|
19
20
|
export * from "./hat.js";
|
|
20
21
|
export * from "./id-counter.js";
|
|
21
22
|
export * from "./is.js";
|
|
@@ -23,9 +24,9 @@ export * from "./loopy.js";
|
|
|
23
24
|
export * from "./map-g.js";
|
|
24
25
|
export * from "./nap.js";
|
|
25
26
|
export * from "./ob.js";
|
|
27
|
+
export * from "./once.js";
|
|
26
28
|
export * from "./pipe.js";
|
|
27
|
-
export * from "./
|
|
29
|
+
export * from "./repeat.js";
|
|
28
30
|
export * from "./pubsub.js";
|
|
29
31
|
export * from "./time.js";
|
|
30
|
-
export * from "./tracker.js";
|
|
31
32
|
export * from "./trash.js";
|
package/x/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * from "./dedupe.js";
|
|
|
16
16
|
export * from "./defer.js";
|
|
17
17
|
export * from "./drill.js";
|
|
18
18
|
export * from "./escape-regex.js";
|
|
19
|
+
export * from "./ev.js";
|
|
19
20
|
export * from "./hat.js";
|
|
20
21
|
export * from "./id-counter.js";
|
|
21
22
|
export * from "./is.js";
|
|
@@ -23,10 +24,10 @@ export * from "./loopy.js";
|
|
|
23
24
|
export * from "./map-g.js";
|
|
24
25
|
export * from "./nap.js";
|
|
25
26
|
export * from "./ob.js";
|
|
27
|
+
export * from "./once.js";
|
|
26
28
|
export * from "./pipe.js";
|
|
27
|
-
export * from "./
|
|
29
|
+
export * from "./repeat.js";
|
|
28
30
|
export * from "./pubsub.js";
|
|
29
31
|
export * from "./time.js";
|
|
30
|
-
export * from "./tracker.js";
|
|
31
32
|
export * from "./trash.js";
|
|
32
33
|
//# sourceMappingURL=index.js.map
|
package/x/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../s/index.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAE7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,gBAAgB,CAAA;AAE9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../s/index.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAE7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AAEnC,cAAc,gBAAgB,CAAA;AAE9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA"}
|
package/x/once.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function once<Fn extends (...a: any[]) => any>(fn: Fn): Fn;
|
package/x/once.js
ADDED
package/x/once.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"once.js","sourceRoot":"","sources":["../s/once.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,IAAI,CAAkC,EAAM;IAC3D,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,IAAI,GAAQ,CAAA;IAEZ,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE;QAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,IAAI,GAAG,IAAI,CAAA;YACX,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACf,CAAC;QACD,OAAO,GAAG,CAAA;IACX,CAAC,CAAO,CAAA;AACT,CAAC"}
|
package/x/pubsub.d.ts
CHANGED
|
@@ -9,8 +9,8 @@ export interface Xub<A extends any[] = []> {
|
|
|
9
9
|
* @alias sub
|
|
10
10
|
*/
|
|
11
11
|
on(fn: Listener<A>): () => void;
|
|
12
|
-
/**
|
|
13
|
-
|
|
12
|
+
/** wait for the next published value */
|
|
13
|
+
next(): Promise<A>;
|
|
14
14
|
/** wipe all listeners attached to this. */
|
|
15
15
|
clear(): void;
|
|
16
16
|
}
|
package/x/pubsub.js
CHANGED
|
@@ -8,7 +8,7 @@ export function xub() {
|
|
|
8
8
|
async function pub(...a) {
|
|
9
9
|
await Promise.all([...set].map(fn => fn(...a)));
|
|
10
10
|
}
|
|
11
|
-
async function
|
|
11
|
+
async function next() {
|
|
12
12
|
const { promise, resolve } = defer();
|
|
13
13
|
const unsubscribe = sub((...a) => {
|
|
14
14
|
resolve(a);
|
|
@@ -22,12 +22,12 @@ export function xub() {
|
|
|
22
22
|
sub.pub = pub;
|
|
23
23
|
sub.sub = sub;
|
|
24
24
|
sub.on = sub;
|
|
25
|
-
sub.
|
|
25
|
+
sub.next = next;
|
|
26
26
|
sub.clear = clear;
|
|
27
27
|
pub.pub = pub;
|
|
28
28
|
pub.sub = sub;
|
|
29
29
|
pub.on = sub;
|
|
30
|
-
pub.
|
|
30
|
+
pub.next = next;
|
|
31
31
|
pub.clear = clear;
|
|
32
32
|
return [pub, sub];
|
|
33
33
|
}
|
package/x/repeat.d.ts
ADDED
package/x/repeat.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* repeat the given async function over and over.
|
|
3
|
+
* - consider using `nap` in your fn to create a delay
|
|
4
|
+
*/
|
|
5
|
+
export function repeat(fn) {
|
|
6
|
+
let timeout;
|
|
7
|
+
let stopped = false;
|
|
8
|
+
const stop = () => {
|
|
9
|
+
stopped = true;
|
|
10
|
+
clearTimeout(timeout);
|
|
11
|
+
};
|
|
12
|
+
const tick = async () => {
|
|
13
|
+
if (stopped)
|
|
14
|
+
return;
|
|
15
|
+
await fn(stop);
|
|
16
|
+
if (stopped)
|
|
17
|
+
return;
|
|
18
|
+
timeout = setTimeout(tick, 0);
|
|
19
|
+
};
|
|
20
|
+
tick();
|
|
21
|
+
return stop;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=repeat.js.map
|
package/x/repeat.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeat.js","sourceRoot":"","sources":["../s/repeat.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,EAAuC;IAC7D,IAAI,OAAY,CAAA;IAChB,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,MAAM,IAAI,GAAG,GAAG,EAAE;QACjB,OAAO,GAAG,IAAI,CAAA;QACd,YAAY,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,KAAK,IAAG,EAAE;QACtB,IAAI,OAAO;YAAE,OAAM;QACnB,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,OAAO;YAAE,OAAM;QACnB,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAA;IAED,IAAI,EAAE,CAAA;IACN,OAAO,IAAI,CAAA;AACZ,CAAC"}
|
package/s/repeatly.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
export function repeatly(milliseconds: number, fn: () => Promise<void>) {
|
|
3
|
-
let timeout: any
|
|
4
|
-
let stop = false
|
|
5
|
-
|
|
6
|
-
async function tick() {
|
|
7
|
-
if (stop) return undefined
|
|
8
|
-
await fn()
|
|
9
|
-
timeout = setTimeout(tick, milliseconds)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
timeout = setTimeout(tick, milliseconds)
|
|
13
|
-
|
|
14
|
-
return () => {
|
|
15
|
-
stop = true
|
|
16
|
-
clearTimeout(timeout)
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
package/s/tracker.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {Sub, sub} from "./pubsub.js"
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* tracking system for state management.
|
|
6
|
-
* - it tracks when items are seen or changed
|
|
7
|
-
*
|
|
8
|
-
* for item integration,
|
|
9
|
-
* - items can call `tracker.see(this)` when they are accessed
|
|
10
|
-
* - items can call `tracker.change(this)` when they are reassigned
|
|
11
|
-
*
|
|
12
|
-
* for reactivity integration,
|
|
13
|
-
* - run `tracker.seen(renderFn)`, collecting a set of seen items
|
|
14
|
-
* - loop over each seen item, attach a changed handler `tracker.changed(item, handlerFn)`
|
|
15
|
-
*/
|
|
16
|
-
export class Tracker<Item extends object = any> {
|
|
17
|
-
#seeables: Set<Item>[] = []
|
|
18
|
-
#changeables = new WeakMap<Item, Sub>()
|
|
19
|
-
|
|
20
|
-
/** indicate item was accessed */
|
|
21
|
-
see(item: Item) {
|
|
22
|
-
this.#seeables.at(-1)?.add(item)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** collect which items were seen during fn */
|
|
26
|
-
seen<R>(fn: () => R) {
|
|
27
|
-
this.#seeables.push(new Set())
|
|
28
|
-
const result = fn()
|
|
29
|
-
const seen = this.#seeables.pop()!
|
|
30
|
-
return {seen, result}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** indicate item was changed */
|
|
34
|
-
change(item: Item) {
|
|
35
|
-
this.#guaranteeChangeable(item).pub()
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** respond to changes by calling fn */
|
|
39
|
-
changed(item: Item, fn: () => void) {
|
|
40
|
-
return this.#guaranteeChangeable(item)(fn)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
#guaranteeChangeable(item: Item) {
|
|
44
|
-
let on = this.#changeables.get(item)
|
|
45
|
-
if (!on) {
|
|
46
|
-
on = sub()
|
|
47
|
-
this.#changeables.set(item, on)
|
|
48
|
-
}
|
|
49
|
-
return on
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const key = Symbol.for("e280.tracker")
|
|
54
|
-
|
|
55
|
-
/** standard global tracker for integrations */
|
|
56
|
-
export const tracker: Tracker = (globalThis as any)[key] ??= new Tracker()
|
|
57
|
-
|
package/x/repeatly.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function repeatly(milliseconds: number, fn: () => Promise<void>): () => void;
|
package/x/repeatly.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export function repeatly(milliseconds, fn) {
|
|
2
|
-
let timeout;
|
|
3
|
-
let stop = false;
|
|
4
|
-
async function tick() {
|
|
5
|
-
if (stop)
|
|
6
|
-
return undefined;
|
|
7
|
-
await fn();
|
|
8
|
-
timeout = setTimeout(tick, milliseconds);
|
|
9
|
-
}
|
|
10
|
-
timeout = setTimeout(tick, milliseconds);
|
|
11
|
-
return () => {
|
|
12
|
-
stop = true;
|
|
13
|
-
clearTimeout(timeout);
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=repeatly.js.map
|
package/x/repeatly.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repeatly.js","sourceRoot":"","sources":["../s/repeatly.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,QAAQ,CAAC,YAAoB,EAAE,EAAuB;IACrE,IAAI,OAAY,CAAA;IAChB,IAAI,IAAI,GAAG,KAAK,CAAA;IAEhB,KAAK,UAAU,IAAI;QAClB,IAAI,IAAI;YAAE,OAAO,SAAS,CAAA;QAC1B,MAAM,EAAE,EAAE,CAAA;QACV,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACzC,CAAC;IAED,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IAExC,OAAO,GAAG,EAAE;QACX,IAAI,GAAG,IAAI,CAAA;QACX,YAAY,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC,CAAA;AACF,CAAC"}
|
package/x/tracker.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* tracking system for state management.
|
|
3
|
-
* - it tracks when items are seen or changed
|
|
4
|
-
*
|
|
5
|
-
* for item integration,
|
|
6
|
-
* - items can call `tracker.see(this)` when they are accessed
|
|
7
|
-
* - items can call `tracker.change(this)` when they are reassigned
|
|
8
|
-
*
|
|
9
|
-
* for reactivity integration,
|
|
10
|
-
* - run `tracker.seen(renderFn)`, collecting a set of seen items
|
|
11
|
-
* - loop over each seen item, attach a changed handler `tracker.changed(item, handlerFn)`
|
|
12
|
-
*/
|
|
13
|
-
export declare class Tracker<Item extends object = any> {
|
|
14
|
-
#private;
|
|
15
|
-
/** indicate item was accessed */
|
|
16
|
-
see(item: Item): void;
|
|
17
|
-
/** collect which items were seen during fn */
|
|
18
|
-
seen<R>(fn: () => R): {
|
|
19
|
-
seen: Set<Item>;
|
|
20
|
-
result: R;
|
|
21
|
-
};
|
|
22
|
-
/** indicate item was changed */
|
|
23
|
-
change(item: Item): void;
|
|
24
|
-
/** respond to changes by calling fn */
|
|
25
|
-
changed(item: Item, fn: () => void): () => void;
|
|
26
|
-
}
|
|
27
|
-
/** standard global tracker for integrations */
|
|
28
|
-
export declare const tracker: Tracker;
|
package/x/tracker.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { sub } from "./pubsub.js";
|
|
2
|
-
/**
|
|
3
|
-
* tracking system for state management.
|
|
4
|
-
* - it tracks when items are seen or changed
|
|
5
|
-
*
|
|
6
|
-
* for item integration,
|
|
7
|
-
* - items can call `tracker.see(this)` when they are accessed
|
|
8
|
-
* - items can call `tracker.change(this)` when they are reassigned
|
|
9
|
-
*
|
|
10
|
-
* for reactivity integration,
|
|
11
|
-
* - run `tracker.seen(renderFn)`, collecting a set of seen items
|
|
12
|
-
* - loop over each seen item, attach a changed handler `tracker.changed(item, handlerFn)`
|
|
13
|
-
*/
|
|
14
|
-
export class Tracker {
|
|
15
|
-
#seeables = [];
|
|
16
|
-
#changeables = new WeakMap();
|
|
17
|
-
/** indicate item was accessed */
|
|
18
|
-
see(item) {
|
|
19
|
-
this.#seeables.at(-1)?.add(item);
|
|
20
|
-
}
|
|
21
|
-
/** collect which items were seen during fn */
|
|
22
|
-
seen(fn) {
|
|
23
|
-
this.#seeables.push(new Set());
|
|
24
|
-
const result = fn();
|
|
25
|
-
const seen = this.#seeables.pop();
|
|
26
|
-
return { seen, result };
|
|
27
|
-
}
|
|
28
|
-
/** indicate item was changed */
|
|
29
|
-
change(item) {
|
|
30
|
-
this.#guaranteeChangeable(item).pub();
|
|
31
|
-
}
|
|
32
|
-
/** respond to changes by calling fn */
|
|
33
|
-
changed(item, fn) {
|
|
34
|
-
return this.#guaranteeChangeable(item)(fn);
|
|
35
|
-
}
|
|
36
|
-
#guaranteeChangeable(item) {
|
|
37
|
-
let on = this.#changeables.get(item);
|
|
38
|
-
if (!on) {
|
|
39
|
-
on = sub();
|
|
40
|
-
this.#changeables.set(item, on);
|
|
41
|
-
}
|
|
42
|
-
return on;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const key = Symbol.for("e280.tracker");
|
|
46
|
-
/** standard global tracker for integrations */
|
|
47
|
-
export const tracker = globalThis[key] ??= new Tracker();
|
|
48
|
-
//# sourceMappingURL=tracker.js.map
|
package/x/tracker.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../s/tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,GAAG,EAAC,MAAM,aAAa,CAAA;AAEpC;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,OAAO;IACnB,SAAS,GAAgB,EAAE,CAAA;IAC3B,YAAY,GAAG,IAAI,OAAO,EAAa,CAAA;IAEvC,iCAAiC;IACjC,GAAG,CAAC,IAAU;QACb,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAI,EAAW;QAClB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAG,CAAA;QAClC,OAAO,EAAC,IAAI,EAAE,MAAM,EAAC,CAAA;IACtB,CAAC;IAED,gCAAgC;IAChC,MAAM,CAAC,IAAU;QAChB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;IACtC,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,IAAU,EAAE,EAAc;QACjC,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,oBAAoB,CAAC,IAAU;QAC9B,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,EAAE,EAAE,CAAC;YACT,EAAE,GAAG,GAAG,EAAE,CAAA;YACV,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,EAAE,CAAA;IACV,CAAC;CACD;AAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAEtC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAa,UAAkB,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE,CAAA"}
|