@cgtk/std 0.0.194 → 0.0.196

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 (96) hide show
  1. package/array.d.ts +2 -1
  2. package/array.js +2 -1
  3. package/async.d.ts +3 -3
  4. package/async.js +15 -2
  5. package/buffer.d.ts +7 -14
  6. package/buffer.js +25 -51
  7. package/channel.d.ts +37 -0
  8. package/channel.js +82 -0
  9. package/checks.d.ts +1 -0
  10. package/checks.js +4 -3
  11. package/dom.d.ts +21 -2
  12. package/dom.js +67 -4
  13. package/fn.d.ts +5 -9
  14. package/fn.js +4 -7
  15. package/math.d.ts +2 -0
  16. package/math.js +5 -0
  17. package/package.json +3 -6
  18. package/resource.d.ts +8 -1
  19. package/resource.js +26 -8
  20. package/schedule.d.ts +3 -3
  21. package/schedule.js +8 -6
  22. package/string.d.ts +1 -0
  23. package/string.js +1 -0
  24. package/types.d.ts +2 -6
  25. package/signal.d.ts +0 -37
  26. package/signal.js +0 -89
  27. package/src/array.d.ts +0 -14
  28. package/src/array.js +0 -21
  29. package/src/assign.d.ts +0 -8
  30. package/src/assign.js +0 -26
  31. package/src/async.d.ts +0 -8
  32. package/src/async.js +0 -31
  33. package/src/base64.d.ts +0 -1
  34. package/src/base64.js +0 -7
  35. package/src/basen.d.ts +0 -12
  36. package/src/basen.js +0 -31
  37. package/src/checks.d.ts +0 -29
  38. package/src/checks.js +0 -44
  39. package/src/constants.d.ts +0 -5
  40. package/src/constants.js +0 -1
  41. package/src/dom.d.ts +0 -50
  42. package/src/dom.js +0 -36
  43. package/src/fn.d.ts +0 -33
  44. package/src/fn.js +0 -61
  45. package/src/http.d.ts +0 -9
  46. package/src/http.js +0 -33
  47. package/src/index.d.ts +0 -1
  48. package/src/index.js +0 -1
  49. package/src/iterable.d.ts +0 -43
  50. package/src/iterable.js +0 -158
  51. package/src/json.d.ts +0 -1
  52. package/src/json.js +0 -1
  53. package/src/map.d.ts +0 -12
  54. package/src/map.js +0 -35
  55. package/src/math.d.ts +0 -34
  56. package/src/math.js +0 -43
  57. package/src/npy.d.ts +0 -10
  58. package/src/npy.js +0 -29
  59. package/src/number.d.ts +0 -4
  60. package/src/number.js +0 -13
  61. package/src/object.d.ts +0 -15
  62. package/src/object.js +0 -13
  63. package/src/port.d.ts +0 -30
  64. package/src/port.js +0 -56
  65. package/src/progress.d.ts +0 -6
  66. package/src/progress.js +0 -1
  67. package/src/rect.d.ts +0 -5
  68. package/src/rect.js +0 -16
  69. package/src/resource.d.ts +0 -12
  70. package/src/resource.js +0 -28
  71. package/src/schedule.d.ts +0 -10
  72. package/src/schedule.js +0 -33
  73. package/src/set.d.ts +0 -2
  74. package/src/set.js +0 -2
  75. package/src/signal.d.ts +0 -37
  76. package/src/signal.js +0 -89
  77. package/src/stream.d.ts +0 -6
  78. package/src/stream.js +0 -26
  79. package/src/string.d.ts +0 -8
  80. package/src/string.js +0 -29
  81. package/src/struct.d.ts +0 -42
  82. package/src/struct.js +0 -58
  83. package/src/tree.d.ts +0 -11
  84. package/src/tree.js +0 -25
  85. package/src/treemap.d.ts +0 -13
  86. package/src/treemap.js +0 -71
  87. package/src/typedarray.d.ts +0 -31
  88. package/src/typedarray.js +0 -39
  89. package/src/types.d.ts +0 -63
  90. package/src/types.js +0 -1
  91. package/src/utils.d.ts +0 -4
  92. package/src/utils.js +0 -30
  93. package/src/weak.d.ts +0 -2
  94. package/src/weak.js +0 -5
  95. /package/{src/buffer.d.ts → bytes.d.ts} +0 -0
  96. /package/{src/buffer.js → bytes.js} +0 -0
package/resource.js CHANGED
@@ -1,16 +1,24 @@
1
- import { forEach, noop } from "./fn.js";
1
+ import * as F from "./fn.js";
2
2
  import { isFunction } from "./checks.js";
3
- export const resource = (value, dispose = noop) => {
4
- const res = ((f) => forEach(f(value) ?? noop, dispose));
3
+ import { add } from "./set.js";
4
+ import { mapValues } from "./object.js";
5
+ export const resource = (value, dispose = F.noop) => {
6
+ const res = ((f) => F.forEach(f(value) ?? F.noop, dispose));
5
7
  res.value = value;
6
8
  res.dispose = dispose;
7
9
  res.map = (f) => resource(f(value), dispose);
10
+ res.flatMap = (f) => {
11
+ const res = f(value);
12
+ return resource(res.value, F.forEach(res.dispose, dispose));
13
+ };
14
+ res.promise = async (f) => F.forEach((await f(value)) ?? F.noop, dispose);
8
15
  return res;
9
16
  };
10
- const isResource = (r) => isFunction(r)
11
- && Object.hasOwn(r, "value")
12
- && Object.hasOwn(r, "dispose")
13
- && isFunction(r["dispose"]);
17
+ export const awaited = async ({ value, dispose }) => resource(await value, dispose);
18
+ const isResource = (r) => isFunction(r) &&
19
+ Object.hasOwn(r, "value") &&
20
+ Object.hasOwn(r, "dispose") &&
21
+ isFunction(r["dispose"]);
14
22
  export const compose = (rs) => {
15
23
  const disposes = [];
16
24
  const rec = (rs) => {
@@ -24,5 +32,15 @@ export const compose = (rs) => {
24
32
  return Object.fromEntries(Object.entries(rs).map(([k, v]) => [k, rec(v)]));
25
33
  };
26
34
  const value = rec(rs);
27
- return resource(value, forEach(...disposes));
35
+ return resource(value, F.forEach(...disposes));
36
+ };
37
+ export const of = (x, f) => resource(x, f(x));
38
+ export const gen = (f) => {
39
+ const res = new Set();
40
+ return resource(f((r) => (res.add(r.dispose), r.value), F.bind(add, res)), () => res.forEach((f) => f()));
41
+ };
42
+ export const consume = (f) => F.disposable((use) => use(f((r) => (use(r.dispose), r.value)) ?? F.noop));
43
+ export const swapping = (fs) => {
44
+ const swap = F.swapping();
45
+ return resource(mapValues(fs, swap), swap(F.noop));
28
46
  };
package/schedule.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import type { Dispose, Fn, FnV, Reactive } from './types.js';
2
2
  export declare const raf: Reactive<number>;
3
- export declare const timeout: (ms: number) => Reactive<void>;
3
+ export declare const timeout: (ms?: number) => Reactive<void>;
4
4
  export declare const schedule: <T>(s: Reactive<T>) => <F extends FnV>(f: F) => FnV<Parameters<F>, Dispose>;
5
5
  export declare const idempotent: <T>(s: Reactive<T>, d: Fn<Dispose, Dispose>) => <F extends FnV>(f: F) => FnV<Parameters<F>, Dispose>;
6
6
  export declare const debounce: <T>(sched?: Reactive<T>) => Reactive<T>;
7
7
  export declare const reset: <T>(sched?: Reactive<T>) => Reactive<T>;
8
- export declare const repeatedly: <T>(f: Fn<void>, sched?: Reactive<T>) => () => any;
8
+ export declare const repeatedly: <T = number>(sched?: Reactive<T>) => (f: Fn<T, boolean | void>) => () => any;
9
9
  export declare const delayAfter: <F extends FnV<any>>(delta: number, n: number, f: F) => (x: any) => any;
10
- export declare const micro: <F extends FnV>(f: F) => (...xs: Parameters<F>) => void;
10
+ export declare const micro: <F extends FnV>(f: F) => (...xs: Parameters<F>) => (reason?: any) => void;
package/schedule.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { isUndefined, isDefined, counted } from './checks.js';
2
- import { comp, lazy, bind, apply, call, where, disposing, noop } from './fn.js';
2
+ import { comp, lazy, bind, apply, call, where, swapping, noop, abortable } from './fn.js';
3
3
  export const raf = f => bind(cancelAnimationFrame, requestAnimationFrame(f));
4
- export const timeout = (ms) => f => bind(clearTimeout, setTimeout(f, ms));
4
+ export const timeout = (ms = 0) => f => bind(clearTimeout, setTimeout(f, ms));
5
5
  export const schedule = (s) => (f) => call(comp(apply(bind((lazy), f)), s));
6
- export const idempotent = (s, d) => (f) => disposing()((...xs) => d(s(() => f(...xs))));
6
+ export const idempotent = (s, d) => (f) => swapping()((...xs) => d(s(() => f(...xs))));
7
7
  export const debounce = (sched = raf) => {
8
8
  let cancel;
9
9
  const stop = () => { if (isDefined(cancel))
@@ -23,11 +23,13 @@ export const reset = (sched = raf) => {
23
23
  return stop;
24
24
  };
25
25
  };
26
- export const repeatedly = (f, sched = raf) => {
26
+ export const repeatedly = (sched = raf) => (f) => {
27
27
  let cancel;
28
- const g = () => (f(), (cancel = sched(g)));
28
+ const g = (x) => { if (f(x) !== false)
29
+ cancel = sched(g); };
29
30
  cancel = sched(g);
30
31
  return () => cancel();
31
32
  };
32
33
  export const delayAfter = (delta, n, f) => where(counted(n), f, schedule(reset(timeout(delta)))(f));
33
- export const micro = (f) => (...xs) => queueMicrotask(() => f(...xs));
34
+ export const micro = (f) => (...xs) => abortable(signal => queueMicrotask(() => { if (!signal.aborted)
35
+ f(...xs); }));
package/string.d.ts CHANGED
@@ -6,3 +6,4 @@ export declare const objectURL: (data: Uint8Array<ArrayBuffer>, type: string) =>
6
6
  export declare const decode: (label?: string, opts?: TextDecoderOptions) => (x: Uint8Array, stream?: boolean) => string;
7
7
  export declare const readLine: (delims?: Set<number>) => (data: Uint8Array, offset?: number) => string;
8
8
  export declare const DATA_URL: RegExp;
9
+ export declare const came2kebab: (s: string) => string;
package/string.js CHANGED
@@ -27,3 +27,4 @@ export const readLine = (delims = new Set([0x0A])) => {
27
27
  };
28
28
  };
29
29
  export const DATA_URL = /^data:(?<mime>[\w/\-\+]+)?(;(?<params>[\w\-]+\=[^;,\s]+)*)?(;(?<encoding>base64))?,(?<data>.*)$/;
30
+ export const came2kebab = (s) => s.replace(/[A-Z]/g, m => '-' + m.toLowerCase());
package/types.d.ts CHANGED
@@ -6,9 +6,6 @@ export type Structure<T> = T | readonly Structure<T>[] | RecordOf<Structure<T>>;
6
6
  export type Optional<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>;
7
7
  export type Tuple<T, N extends number, R extends T[] = []> = R['length'] extends N ? R : Tuple<T, N, [T, ...R]>;
8
8
  export type Elements<A extends readonly unknown[]> = A extends readonly (infer T)[] ? T : never;
9
- export type MaybeFirst<T extends unknown[], S = void> = T extends {
10
- length: 0;
11
- } ? S : T[0];
12
9
  export type FnV<T extends any[] = any[], R = any> = (...x: T) => R;
13
10
  export type Fn<T = any, R = any> = FnV<[T], R>;
14
11
  export type FnP<T = any, R = any> = (x: T) => Promise<R>;
@@ -18,8 +15,7 @@ export type Fns<T> = {
18
15
  export type FnF = <F extends FnV>(f: F) => (...xs: Parameters<F>) => ReturnType<F>;
19
16
  export type Dispose = Fn<void>;
20
17
  export type Reactive<T = unknown, R = any> = Fn<Fn<T, R>, Dispose>;
21
- export type Constantly<T> = () => T;
22
- export type FirstParam<F extends FnV> = MaybeFirst<Parameters<F>>;
18
+ export type Lazy<T> = () => T;
23
19
  export type MaybePromise<T = unknown> = T | PromiseLike<T>;
24
20
  export type Last<T extends any[]> = T extends [...any, infer Rest] ? Rest : never;
25
21
  export type Tail<T extends any[]> = T extends [any, ...(infer Rest)] ? Rest : never;
@@ -39,7 +35,7 @@ export type Entries<T> = {
39
35
  export type EntriesTuple<T, K extends UnionToTuple<keyof T> = UnionToTuple<keyof T>> = {
40
36
  [I in keyof K]: K[I] extends keyof T ? [K[I], T[K[I]]] : never;
41
37
  };
42
- export type UintArray<T extends ArrayBufferLike = ArrayBufferLike> = Uint8Array<T> | Uint16Array<T> | Uint32Array<T>;
38
+ export type UintArray<T extends ArrayBufferLike = ArrayBufferLike> = Uint8Array<T> | Uint8ClampedArray<T> | Uint16Array<T> | Uint32Array<T>;
43
39
  export type IntArray<T extends ArrayBufferLike = ArrayBufferLike> = Int8Array<T> | Int16Array<T> | Int32Array<T>;
44
40
  export type FloatArray<T extends ArrayBufferLike = ArrayBufferLike> = Float16Array<T> | Float32Array<T> | Float64Array<T>;
45
41
  export type BigIntArray<T extends ArrayBufferLike = ArrayBufferLike> = BigUint64Array<T> | BigInt64Array<T>;
package/signal.d.ts DELETED
@@ -1,37 +0,0 @@
1
- import type { Fn, FnV, Fns, Pred, Reactive, RecordOf, Structure } from "./types.js";
2
- export type Signal<T> = Fn<T> & {
3
- on: Reactive<T>;
4
- };
5
- export declare const create: <T>(f: Fn<T>, on: Reactive<T>) => Signal<T>;
6
- export declare const signal: <T>(fns?: Set<Fn<T>>) => Signal<T>;
7
- export declare const map: <T, S>(source: Reactive<T>, f: Fn<T, S>) => Reactive<S>;
8
- export declare const filter: <T>(source: Reactive<T>, p: Pred<T>) => Reactive<T>;
9
- export declare const cache: <T>(source: Reactive<T>) => Reactive<T>;
10
- export interface ValueLike<T> {
11
- value: T;
12
- on: Reactive<T>;
13
- }
14
- export interface Box<T, F extends RecordOf<FnV>> extends ValueLike<T> {
15
- ops: F;
16
- }
17
- export interface Value<T> extends ValueLike<T> {
18
- op: <F extends FnV>(f: Fn<T, F>) => F;
19
- ops: <F extends RecordOf<FnV>>(f: Fn<T, F>) => F;
20
- set: Fn<T>;
21
- update(): void;
22
- map<S>(f: Fn<T, S>): Reactive<S>;
23
- box: <F extends RecordOf<FnV>>(f: Fn<T, F>) => Box<T, F>;
24
- }
25
- export declare const value: <T>(x: T, fs?: Set<Fn<T>>) => Value<T>;
26
- export type Values<T extends RecordOf<any>> = {
27
- [k in keyof T]: Value<T[k]>;
28
- };
29
- export declare const values: <T extends RecordOf<any>>(vals: T) => Values<T>;
30
- type Unwrapped<T> = T extends ValueLike<infer U> ? U : {
31
- [K in keyof T]: Unwrapped<T[K]>;
32
- };
33
- export declare const compose: <T extends Structure<ValueLike<any>>, S = Unwrapped<T>>(xs: T, transform?: Fn<Unwrapped<T>, S>) => Reactive<S>;
34
- export declare const mux: <I extends RecordOf<any>, O extends RecordOf<any>>(init: Fn<Fns<O>, Fns<I>>) => Fns<I> & {
35
- on: { [k in keyof O]: Reactive<O[k]>; };
36
- };
37
- export {};
package/signal.js DELETED
@@ -1,89 +0,0 @@
1
- import { after, constantly, noop, bind, comp, forEach, filter as filter_, identity } from "./fn.js";
2
- import { mapValues } from "./object.js";
3
- import { isDefined, isFunction } from "./checks.js";
4
- import { add } from "./set.js";
5
- export const create = (f, on) => {
6
- const g = f;
7
- g.on = on;
8
- return g;
9
- };
10
- export const signal = (fns = new Set()) => create((x) => fns.forEach(f => f(x)), bind(add, fns));
11
- export const map = (source, f) => g => source(comp(f, g));
12
- export const filter = (source, p) => f => source(filter_(p, f));
13
- export const cache = (source) => {
14
- let x;
15
- source(y => x = y);
16
- return f => {
17
- if (isDefined(x))
18
- f(x);
19
- return source(f);
20
- };
21
- };
22
- ;
23
- ;
24
- const isValueLike = (v) => Object.hasOwn(v, "value") && Object.hasOwn(v, "on") && isFunction(v.on);
25
- export const value = (x, fs = new Set()) => {
26
- const sig = signal(fs);
27
- const notify = after(() => sig(x));
28
- const op = (f) => notify(f(x));
29
- const on = (f) => (f(x), sig.on(f));
30
- const ops = (f) => mapValues(f(x), notify);
31
- return {
32
- get value() { return x; },
33
- set value(y) { sig(x = y); },
34
- op, on, ops,
35
- set: op(constantly((y) => x = y)),
36
- update: op(constantly(noop)),
37
- map: bind(map, on),
38
- box: (f) => ({
39
- on,
40
- get value() { return x; },
41
- ops: ops(f),
42
- })
43
- };
44
- };
45
- export const values = (vals) => mapValues(vals, v => value(v));
46
- export const compose = (xs, transform = identity) => f => {
47
- const collect = (vs) => {
48
- if (isValueLike(vs)) {
49
- return vs.value;
50
- }
51
- else if (Array.isArray(vs)) {
52
- return vs.map(collect);
53
- }
54
- return Object.fromEntries(Object.entries(vs).map(([k, v]) => [k, collect(v)]));
55
- };
56
- const notify = () => f(transform(collect(xs)));
57
- let ready = false;
58
- const sub = (vs) => {
59
- if (isValueLike(vs)) {
60
- return vs.on(() => { if (ready)
61
- notify(); });
62
- }
63
- else if (Array.isArray(vs)) {
64
- return forEach(...vs.map(sub));
65
- }
66
- return forEach(...Object.values(vs).map(sub));
67
- };
68
- const off = sub(xs);
69
- ready = true;
70
- notify();
71
- return off;
72
- };
73
- export const mux = (init) => {
74
- const sigs = {};
75
- const ins = init(new Proxy({}, {
76
- get: (_, k) => (x) => {
77
- const f = sigs[k];
78
- if (isDefined(f))
79
- f(x);
80
- }
81
- }));
82
- ins.on = new Proxy({}, {
83
- get: (_, k) => f => {
84
- const sig = sigs[k] ??= signal();
85
- return sig.on(f);
86
- }
87
- });
88
- return ins;
89
- };
package/src/array.d.ts DELETED
@@ -1,14 +0,0 @@
1
- import type { Fn, Tuple } from "./types.js";
2
- export declare const empty: <T>() => T[];
3
- export declare const push: <T>(xs: T[], x: T) => T[];
4
- export declare const unshift: <T>(xs: T[], x: T) => T[];
5
- export declare const get: (i: number) => <T>(xs: T[]) => T;
6
- export declare const pop: <T>(xs: T[]) => T[];
7
- export declare const shift: <T>(xs: T[]) => T[];
8
- export declare const first: <T>(xs: T[]) => T;
9
- export declare const cap: <T>(n: number, f: Fn<T[]>) => Fn<T[], T[]>;
10
- export declare const retain: <T>(n: number, xs?: T[]) => (x: T) => T[];
11
- export declare const tuple: <T, N extends number>(...xs: T[] & {
12
- length: N;
13
- }) => Tuple<T, N>;
14
- export declare const seek: <T>(arr: ArrayLike<T>, vals: Set<T | number>, offset?: number) => number;
package/src/array.js DELETED
@@ -1,21 +0,0 @@
1
- import { comp, scan } from "./fn.js";
2
- export const empty = () => [];
3
- export const push = (xs, x) => (xs.push(x), xs);
4
- export const unshift = (xs, x) => (xs.unshift(x), xs);
5
- export const get = (i) => (xs) => xs[i];
6
- export const pop = (xs) => (xs.pop(), xs);
7
- export const shift = (xs) => (xs.shift(), xs);
8
- export const first = (xs) => xs[0];
9
- export const cap = (n, f) => xs => {
10
- while (xs.length > n)
11
- f(xs);
12
- return xs;
13
- };
14
- export const retain = (n, xs = []) => comp(scan((push), xs), cap(n, shift));
15
- export const tuple = (...xs) => xs;
16
- export const seek = (arr, vals, offset = 0) => {
17
- for (let i = offset, n = arr.length; i < n; i++)
18
- if (vals.has(arr[i]))
19
- return i;
20
- return -1;
21
- };
package/src/assign.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import type { RecordOf } from "./types.js";
2
- type PO = RecordOf<unknown>;
3
- type Merge<T extends PO, S extends PO> = {
4
- [K in keyof (T & S)]: K extends keyof S ? (K extends keyof T ? (S[K] extends PO ? (T[K] extends PO ? Merge<T[K], S[K]> : S[K]) : S[K]) : S[K]) : (K extends keyof T ? T[K] : never);
5
- };
6
- type Assign<T extends PO, Ts extends PO[]> = Ts extends [infer A extends PO, ...infer R extends PO[]] ? Assign<Merge<T, A>, R> : T;
7
- export declare const assign: <T extends PO, Ts extends PO[]>(target: T, ...sources: Ts) => Assign<T, Ts>;
8
- export {};
package/src/assign.js DELETED
@@ -1,26 +0,0 @@
1
- import { isUndefined, isNull } from "./checks.js";
2
- const isPrimitive = (x) => {
3
- const t = typeof x;
4
- return t === "string" || t === "number" || t === "boolean";
5
- };
6
- function isPlainObject(x) {
7
- if (typeof x !== 'object')
8
- return false;
9
- const prototype = Object.getPrototypeOf(x);
10
- return !!prototype && prototype.constructor === Object && prototype === Object.prototype;
11
- }
12
- const canClone = (x) => isPrimitive(x) || isPlainObject(x) &&
13
- Object.values(x).every(x => isUndefined(x) || isNull(x) || isPrimitive(x) || canClone(x));
14
- const merge = (target, source) => {
15
- Object.keys(source).forEach(key => {
16
- const s = source[key], t = target[key];
17
- if (isPlainObject(t) && isPlainObject(s))
18
- target[key] = merge(t, s);
19
- else if (canClone(s))
20
- target[key] = structuredClone(s);
21
- else
22
- target[key] = s;
23
- });
24
- return target;
25
- };
26
- export const assign = (target, ...sources) => sources.reduce(merge, target);
package/src/async.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import type { Fn, Constantly, Maybe, Dispose, MaybePromise } from "./types.js";
2
- export declare const timeout: (ms: number, signal?: AbortSignal) => Promise<unknown>;
3
- export declare const delay: (ms: number, signal?: AbortSignal) => <T>(x: T) => Promise<T>;
4
- export declare const probing: <T>(p: Promise<T>) => Constantly<Maybe<T>>;
5
- export declare const resolved: <T>(p: Promise<T>) => (f: Fn<T>) => () => void;
6
- export declare const promise: <T>(x: MaybePromise<T>) => Promise<any>;
7
- export declare const then: <T>(p: Promise<T>) => <R>(f: Fn<T, R>) => Promise<R>;
8
- export declare const dispose: (p: Promise<Dispose>) => Dispose;
package/src/async.js DELETED
@@ -1,31 +0,0 @@
1
- import { filterT, disposable } from "./fn.js";
2
- import { isDefined } from "./checks.js";
3
- export const timeout = (ms, signal) => new Promise((resolve, reject) => {
4
- if (signal?.aborted)
5
- reject(signal.reason);
6
- else {
7
- const t = setTimeout(() => {
8
- if (signal?.aborted)
9
- reject(signal.reason);
10
- else
11
- resolve(undefined);
12
- }, ms);
13
- signal?.addEventListener("abort", () => (clearTimeout(t), reject(signal.reason)), { once: true });
14
- }
15
- });
16
- export const delay = (ms, signal) => async (x) => (await timeout(ms, signal), x);
17
- export const probing = (p) => {
18
- let value = undefined;
19
- p.then(x => value = x);
20
- return () => value;
21
- };
22
- export const resolved = (p) => {
23
- const val = probing(p);
24
- return (f) => {
25
- const g = (filterT((isDefined), f));
26
- return () => g(val());
27
- };
28
- };
29
- export const promise = (x) => (x instanceof Promise) ? x : Promise.resolve(x);
30
- export const then = (p) => (f) => p.then(f);
31
- export const dispose = (p) => disposable(async (dispose) => dispose(await p));
package/src/base64.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare const decodeBytes: (str: string) => Uint8Array<ArrayBuffer>;
package/src/base64.js DELETED
@@ -1,7 +0,0 @@
1
- export const decodeBytes = (str) => {
2
- const raw = atob(str), size = raw.length;
3
- const res = new Uint8Array(size);
4
- for (let i = 0; i < size; i++)
5
- res[i] = raw.charCodeAt(i);
6
- return res;
7
- };
package/src/basen.d.ts DELETED
@@ -1,12 +0,0 @@
1
- export type Base<N extends number> = [n: N, m: number, d: number];
2
- export declare const basen: <B extends number>(b: B) => (m?: number, n?: number) => Base<B>;
3
- export declare const base10: (m?: number, n?: number) => Base<10>;
4
- export declare const normalize: <B extends number>(x: Base<B>) => Base<B>;
5
- export declare const add: <B extends number>([b, m0, n0]: Base<B>, [_, m1, n1]: Base<B>) => Base<B>;
6
- export declare const mul: <B extends number>([b, m0, n0]: Base<B>, [_, m1, n1]: Base<B>) => Base<B>;
7
- export declare const addN: <B extends number>(x: Base<B>, a: number) => Base<B>;
8
- export declare const mulN: <B extends number>(x: Base<B>, a: number) => Base<B>;
9
- export declare const change: <B extends number, D extends number>([b, m, n]: Base<B>, d: D) => Base<D>;
10
- export declare const toNumber: <B extends number>([b, m, n]: Base<B>) => number;
11
- export declare const toString: <B extends number>([b, m, n]: Base<B>, d?: number) => string;
12
- export declare const toExponential: ([_, m, n]: Base<10>, digits?: number, dMax?: number) => string;
package/src/basen.js DELETED
@@ -1,31 +0,0 @@
1
- import { toFixedMax } from "./number.js";
2
- export const basen = (b) => (m = 0, n = 0) => [b, m, n];
3
- export const base10 = basen(10);
4
- export const normalize = (x) => {
5
- if (!Number.isInteger(x[2])) {
6
- const n = Math.floor(x[2]);
7
- x[1] *= x[0] ** (x[2] - n);
8
- x[2] = n;
9
- }
10
- const d = x[1] != 0 ? Math.floor(Math.log(Math.abs(x[1])) / Math.log(x[0])) : 0;
11
- x[1] /= x[0] ** d;
12
- x[2] += d;
13
- return x;
14
- };
15
- export const add = ([b, m0, n0], [_, m1, n1]) => {
16
- const n = Math.max(n0, n1);
17
- const m = m0 * b ** (n0 - n) + m1 * b ** (n1 - n);
18
- return [b, m, n];
19
- };
20
- export const mul = ([b, m0, n0], [_, m1, n1]) => [b, m0 * m1, n0 + n1];
21
- export const addN = (x, a) => (x[1] += a, normalize(x));
22
- export const mulN = (x, a) => (x[1] *= a, normalize(x));
23
- export const change = ([b, m, n], d) => {
24
- const k = n * Math.log(b) / Math.log(d);
25
- return basen(d)(m, k);
26
- };
27
- export const toNumber = ([b, m, n]) => m * b ** n;
28
- export const toString = ([b, m, n], d = 2) => `${m.toFixed(d)}x${b}^${n}`;
29
- export const toExponential = ([_, m, n], digits = 2, dMax = 2) => Math.abs(n) <= dMax
30
- ? toFixedMax(m * 10 ** n, digits)
31
- : `${toFixedMax(m, digits)}e${n.toFixed(0)}`;
package/src/checks.d.ts DELETED
@@ -1,29 +0,0 @@
1
- import type { TypedArray, NumberArray, BigIntArray, Pred, TPred, Maybe } from "./types.js";
2
- export declare const isTypedArray: (x: any) => x is TypedArray;
3
- export declare const isNumberArray: (x: any) => x is NumberArray;
4
- export declare const isBigIntArray: (x: any) => x is BigIntArray;
5
- export declare const isUndefined: (x: any) => x is undefined;
6
- export declare const isNull: (x: any) => x is null;
7
- export declare const isDefined: <T>(x: Maybe<T>) => x is T;
8
- export declare function assert(condition: boolean, msg: string): asserts condition;
9
- export declare function assertType<T>(x: any, pred: TPred<T>, msg: string): asserts x is T;
10
- export declare const isObject: TPred<Object>;
11
- export declare const isString: TPred<string>;
12
- export declare const isNumber: TPred<number>;
13
- export declare const isBigInt: TPred<bigint>;
14
- export declare const isPositive: Pred<number>;
15
- export declare const isTs: <T>(p: TPred<T>) => TPred<T[]>;
16
- export declare const isclose: (a: number, b: number, eps?: number) => boolean;
17
- export declare const allclose: (a: Array<number> | NumberArray, b: Array<number> | NumberArray, eps?: number) => boolean;
18
- export declare const equal: <T>(a: T, b?: T) => boolean;
19
- export declare const strictEqual: <T>(a: T, b?: T) => boolean;
20
- export declare const isDiffPrev: <T>(eq?: (a: T, b?: T | undefined) => boolean) => Pred<T>;
21
- export declare const isLonger: <T>(delta: number) => Pred<T>;
22
- export declare const isFunction: <T extends Function>(x: any) => x is T;
23
- export declare const isAborted: (signal: AbortSignal) => () => boolean;
24
- export declare const isArrayBufferLike: (x: any) => x is ArrayBufferLike;
25
- export declare const isArrayBufferView: (x: any) => x is ArrayBufferView;
26
- export declare const isEmpty: (x: {
27
- length: number;
28
- }) => boolean;
29
- export declare const counted: (n: number) => () => boolean;
package/src/checks.js DELETED
@@ -1,44 +0,0 @@
1
- import { comp, not, apply, and } from "./fn.js";
2
- import { retain } from "./array.js";
3
- export const isTypedArray = (x) => x && (x instanceof Uint8Array || x instanceof Uint8ClampedArray ||
4
- x instanceof Uint16Array || x instanceof Uint32Array ||
5
- x instanceof Int8Array || x instanceof Int16Array || x instanceof Int32Array ||
6
- x instanceof Float16Array || x instanceof Float32Array || x instanceof Float64Array ||
7
- x instanceof BigUint64Array || x instanceof BigInt64Array);
8
- export const isNumberArray = (x) => x && (x instanceof Uint8Array || x instanceof Uint8ClampedArray ||
9
- x instanceof Uint16Array || x instanceof Uint32Array ||
10
- x instanceof Int8Array || x instanceof Int16Array || x instanceof Int32Array ||
11
- x instanceof Float16Array || x instanceof Float32Array || x instanceof Float64Array);
12
- export const isBigIntArray = (x) => x && (x instanceof BigUint64Array || x instanceof BigInt64Array);
13
- export const isUndefined = (x) => x === undefined;
14
- export const isNull = (x) => x === null;
15
- export const isDefined = (x) => !isUndefined(x);
16
- export function assert(condition, msg) {
17
- if (!condition)
18
- throw new Error(msg);
19
- }
20
- export function assertType(x, pred, msg) { assert(pred(x), msg); }
21
- export const isObject = (x) => x !== null && typeof x === "object";
22
- export const isString = (x) => typeof x === "string";
23
- export const isNumber = (x) => typeof x === 'number';
24
- export const isBigInt = (x) => typeof x === "bigint";
25
- export const isPositive = (x) => x > 0;
26
- export const isTs = (p) => and(Array.isArray, (xs) => xs.every(p));
27
- export const isclose = (a, b, eps = Number.EPSILON) => Math.abs(a - b) < eps;
28
- export const allclose = (a, b, eps) => a.length == b.length && a.every((x, i) => isclose(x, b[i], eps));
29
- export const equal = (a, b) => a == b;
30
- export const strictEqual = (a, b) => a === b;
31
- export const isDiffPrev = (eq = (strictEqual)) => comp(retain(2), not(apply(eq)));
32
- export const isLonger = (delta) => comp((x) => [performance.now(), x], retain(2), (xs) => xs.length < 2 || xs[1][0] - xs[0][0] > delta);
33
- export const isFunction = (x) => typeof x === "function";
34
- export const isAborted = (signal) => () => signal.aborted;
35
- export const isArrayBufferLike = (x) => x instanceof ArrayBuffer || x instanceof SharedArrayBuffer;
36
- export const isArrayBufferView = (x) => x != null &&
37
- isArrayBufferLike(x.buffer) &&
38
- isNumber(x.byteOffset) &&
39
- isNumber(x.byteLength);
40
- export const isEmpty = (x) => x.length == 0;
41
- export const counted = (n) => {
42
- let m = 0;
43
- return () => m++ < n;
44
- };
@@ -1,5 +0,0 @@
1
- export declare const EMPTY: Readonly<{
2
- OBJ: {};
3
- STR: "";
4
- LIST: never[];
5
- }>;
package/src/constants.js DELETED
@@ -1 +0,0 @@
1
- export const EMPTY = Object.freeze({ OBJ: {}, STR: "", LIST: [] });
package/src/dom.d.ts DELETED
@@ -1,50 +0,0 @@
1
- import type { Fn, Dispose, RecordOf, Maybe } from "./types.js";
2
- export declare const customEvent: <T>(type: string, detail: T, { composed, bubbles, cancelable }?: EventInit) => CustomEvent<T>;
3
- type ListenOpts = boolean | AddEventListenerOptions;
4
- export declare const on: {
5
- <T extends HTMLElement, K extends keyof HTMLElementEventMap>(el: T, name: K, listener: Fn<HTMLElementEventMap[K]>, opts?: ListenOpts): Dispose;
6
- <T extends SVGGraphicsElement, K extends keyof SVGElementEventMap>(el: T, name: K, listener: Fn<SVGElementEventMap[K]>, opts?: ListenOpts): Dispose;
7
- <T, K extends keyof MessageEventTargetEventMap>(el: MessageEventTarget<T>, name: K, listener: Fn<MessageEventTargetEventMap[K]>, opts?: ListenOpts): Dispose;
8
- <K extends keyof DocumentEventMap>(el: Document, name: K, listener: Fn<DocumentEventMap[K]>, opts?: ListenOpts): Dispose;
9
- <K extends keyof WindowEventMap>(el: Window, name: K, listener: Fn<WindowEventMap[K]>, opts?: ListenOpts): Dispose;
10
- <K extends keyof WorkerEventMap>(el: Worker, name: K, listener: Fn<WorkerEventMap[K]>, opts?: ListenOpts): Dispose;
11
- <K extends keyof AbortSignalEventMap>(el: AbortSignal, name: K, listener: Fn<AbortSignalEventMap[K]>, opts?: ListenOpts): Dispose;
12
- };
13
- export declare const onAll: {
14
- <T extends keyof HTMLElementEventMap>(el: HTMLElement, listeners: {
15
- [k in T]: Fn<HTMLElementEventMap[k]>;
16
- }, opts?: ListenOpts): Dispose;
17
- <T extends keyof SVGElementEventMap>(el: SVGGraphicsElement, listeners: {
18
- [k in T]: Fn<SVGElementEventMap[k]>;
19
- }, opts?: ListenOpts): Dispose;
20
- <T, K extends keyof MessageEventTargetEventMap>(el: MessageEventTarget<T>, listeners: {
21
- [k in K]: Fn<MessageEventTargetEventMap[k]>;
22
- }, opts?: ListenOpts): Dispose;
23
- <T extends keyof DocumentEventMap>(el: Document, listeners: {
24
- [k in T]: Fn<DocumentEventMap[k]>;
25
- }, opts?: ListenOpts): Dispose;
26
- <T extends keyof WindowEventMap>(el: Window, listeners: {
27
- [k in T]: Fn<WindowEventMap[k]>;
28
- }, opts?: ListenOpts): Dispose;
29
- <T extends keyof WorkerEventMap>(el: Worker, listeners: {
30
- [k in T]: Fn<WorkerEventMap[k]>;
31
- }, opts?: ListenOpts): Dispose;
32
- <T extends keyof AbortSignalEventMap>(el: AbortSignal, listeners: {
33
- [k in T]: Fn<AbortSignalEventMap[k]>;
34
- }, opts?: ListenOpts): Dispose;
35
- };
36
- type DragHandlers = Record<'down' | 'move' | 'up', Fn<PointerEvent>>;
37
- export declare const onDrag: {
38
- (el: HTMLElement, fns: Partial<DragHandlers>): Dispose;
39
- (el: SVGGraphicsElement, fns: Partial<DragHandlers>): Dispose;
40
- };
41
- export declare const onDragMove: {
42
- (el: HTMLElement, f: Fn<PointerEvent>): Dispose;
43
- (el: SVGGraphicsElement, f: Fn<PointerEvent>): Dispose;
44
- };
45
- export declare const onResize: (el: Element, f: Fn<ResizeObserverEntry[]>, options?: ResizeObserverOptions) => Dispose;
46
- export declare const preventDefault: <T extends Event>(e: T) => void;
47
- export declare const loadImage: (img: HTMLImageElement, src: string) => Promise<HTMLImageElement>;
48
- export declare const pushState: (path: string, query?: RecordOf<string>, data?: any) => void;
49
- export declare const qs: (search?: string) => Maybe<RecordOf<string>>;
50
- export {};
package/src/dom.js DELETED
@@ -1,36 +0,0 @@
1
- import { forEach, noop } from "./fn.js";
2
- import { isDefined } from "./checks.js";
3
- import { EMPTY } from "./constants.js";
4
- export const customEvent = (type, detail, { composed = false, bubbles = false, cancelable = false } = EMPTY.OBJ) => new CustomEvent(type, { bubbles, cancelable, composed, detail });
5
- export const on = (el, name, listener, opts = false) => {
6
- el.addEventListener(name, listener, opts);
7
- return () => el.removeEventListener(name, listener, opts);
8
- };
9
- export const onAll = (el, fs, opts) => forEach(...Object.keys(fs).map(k => on(el, k, fs[k], opts)));
10
- export const onDrag = (el, { down = noop, move = noop, up = noop }) => on(el, 'pointerdown', e => {
11
- const pointerId = e.pointerId;
12
- el.setPointerCapture(pointerId);
13
- down(e);
14
- const offMove = on(el, 'pointermove', move);
15
- const offUp = on(el, 'pointerup', e => {
16
- up(e);
17
- el.releasePointerCapture(pointerId);
18
- offMove();
19
- offUp();
20
- });
21
- });
22
- export const onDragMove = (el, move) => onDrag(el, { move });
23
- export const onResize = (el, f, options) => {
24
- const ro = new ResizeObserver(f);
25
- ro.observe(el, options);
26
- return () => ro.disconnect();
27
- };
28
- export const preventDefault = (e) => e.preventDefault();
29
- export const loadImage = (img, src) => new Promise((resolve) => {
30
- const off = on(img, "load", () => (off(), resolve(img)));
31
- img.src = src;
32
- });
33
- export const pushState = (path, query, data) => history.pushState(data, EMPTY.STR, isDefined(query) ? `${path}?${new URLSearchParams(query).toString()}` : path);
34
- export const qs = (search = location.search) => search.length > 0
35
- ? Object.fromEntries(new URLSearchParams(search).entries())
36
- : undefined;