@derivesome/tools 1.0.1

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 (63) hide show
  1. package/.package.json.~undo-tree~ +9 -0
  2. package/.tsconfig.json.~undo-tree~ +5 -0
  3. package/dist/cjs/array.d.ts +40 -0
  4. package/dist/cjs/array.d.ts.map +1 -0
  5. package/dist/cjs/array.js +99 -0
  6. package/dist/cjs/array.js.map +1 -0
  7. package/dist/cjs/index.d.ts +5 -0
  8. package/dist/cjs/index.d.ts.map +1 -0
  9. package/dist/cjs/index.js +21 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/scalar.d.ts +27 -0
  12. package/dist/cjs/scalar.d.ts.map +1 -0
  13. package/dist/cjs/scalar.js +65 -0
  14. package/dist/cjs/scalar.js.map +1 -0
  15. package/dist/cjs/types.d.ts +11 -0
  16. package/dist/cjs/types.d.ts.map +1 -0
  17. package/dist/cjs/types.js +3 -0
  18. package/dist/cjs/types.js.map +1 -0
  19. package/dist/cjs/url.d.ts +2 -0
  20. package/dist/cjs/url.d.ts.map +1 -0
  21. package/dist/cjs/url.js +8 -0
  22. package/dist/cjs/url.js.map +1 -0
  23. package/dist/esm/array.d.ts +40 -0
  24. package/dist/esm/array.d.ts.map +1 -0
  25. package/dist/esm/array.js +99 -0
  26. package/dist/esm/array.js.map +1 -0
  27. package/dist/esm/index.d.ts +5 -0
  28. package/dist/esm/index.d.ts.map +1 -0
  29. package/dist/esm/index.js +21 -0
  30. package/dist/esm/index.js.map +1 -0
  31. package/dist/esm/scalar.d.ts +27 -0
  32. package/dist/esm/scalar.d.ts.map +1 -0
  33. package/dist/esm/scalar.js +65 -0
  34. package/dist/esm/scalar.js.map +1 -0
  35. package/dist/esm/types.d.ts +11 -0
  36. package/dist/esm/types.d.ts.map +1 -0
  37. package/dist/esm/types.js +3 -0
  38. package/dist/esm/types.js.map +1 -0
  39. package/dist/esm/url.d.ts +2 -0
  40. package/dist/esm/url.d.ts.map +1 -0
  41. package/dist/esm/url.js +8 -0
  42. package/dist/esm/url.js.map +1 -0
  43. package/package.json +44 -0
  44. package/package.json~ +51 -0
  45. package/src/.array.ts.~undo-tree~ +6 -0
  46. package/src/.index.ts.~undo-tree~ +9 -0
  47. package/src/.scalar.ts.~undo-tree~ +5 -0
  48. package/src/.types.ts.~undo-tree~ +8 -0
  49. package/src/.url.ts.~undo-tree~ +5 -0
  50. package/src/array.ts +176 -0
  51. package/src/array.ts~ +0 -0
  52. package/src/index.ts +4 -0
  53. package/src/index.ts~ +4 -0
  54. package/src/scalar.ts +72 -0
  55. package/src/scalar.ts~ +72 -0
  56. package/src/types.ts +14 -0
  57. package/src/types.ts~ +0 -0
  58. package/src/url.ts +5 -0
  59. package/src/url.ts~ +5 -0
  60. package/tsconfig.cjs.json +10 -0
  61. package/tsconfig.esm.json +10 -0
  62. package/tsconfig.json +23 -0
  63. package/tsconfig.json~ +23 -0
package/src/array.ts ADDED
@@ -0,0 +1,176 @@
1
+ import { type Triple, type Pair, V2, V3 } from "./types";
2
+
3
+ export const range = (n: number): number[] =>
4
+ n <= 0 || typeof n !== "number" || isNaN(n) || !isFinite(n)
5
+ ? []
6
+ : Array.from(Array(Math.floor(n)).keys());
7
+
8
+ export const zipMin = <A, B>(a: A[], b: B[]): Array<Pair<A, B>> =>
9
+ range(Math.min(a.length, b.length)).map((i): Pair<A, B> => {
10
+ const x = a[i]!;
11
+ const y = b[i]!;
12
+ return [x, y];
13
+ });
14
+
15
+ export const zipMax = <A, B>(
16
+ a: A[],
17
+ b: B[],
18
+ ): Array<Pair<A | undefined, B | undefined>> =>
19
+ range(Math.min(a.length, b.length)).map(
20
+ (i): Pair<A | undefined, B | undefined> => {
21
+ const x = a[i];
22
+ const y = b[i];
23
+ return [x, y];
24
+ },
25
+ );
26
+
27
+ export function toBatched<T>(arr: T[], batchSize: 1, padding: T): Array<[T]>;
28
+ export function toBatched<T>(arr: T[], batchSize: 2, padding: T): Array<[T, T]>;
29
+ export function toBatched<T>(
30
+ arr: T[],
31
+ batchSize: 3,
32
+ padding: T,
33
+ ): Array<[T, T, T]>;
34
+ export function toBatched<T>(
35
+ arr: T[],
36
+ batchSize: 4,
37
+ padding: T,
38
+ ): Array<[T, T, T, T]>;
39
+ export function toBatched<T>(
40
+ arr: T[],
41
+ batchSize: 5,
42
+ padding: T,
43
+ ): Array<[T, T, T, T, T]>;
44
+ export function toBatched<T>(
45
+ arr: T[],
46
+ batchSize: 6,
47
+ padding: T,
48
+ ): Array<[T, T, T, T, T, T]>;
49
+ export function toBatched<T>(
50
+ arr: T[],
51
+ batchSize: 7,
52
+ padding: T,
53
+ ): Array<[T, T, T, T, T, T, T]>;
54
+ export function toBatched<T>(
55
+ arr: T[],
56
+ batchSize: 8,
57
+ padding: T,
58
+ ): Array<[T, T, T, T, T, T, T, T]>;
59
+ export function toBatched<T>(
60
+ arr: T[],
61
+ batchSize: number,
62
+ padding: T,
63
+ ): Array<T[]>;
64
+ export function toBatched<T>(arr: T[], batchSize: number): Array<T[]>;
65
+ export function toBatched<T>(
66
+ arr: T[],
67
+ batchSize: number,
68
+ padding?: T,
69
+ ): Array<T[]>;
70
+ export function toBatched<T>(
71
+ arr: T[],
72
+ batchSize: number,
73
+ padding?: T,
74
+ ): Array<T[]> {
75
+ const output: Array<T[]> = [];
76
+
77
+ for (let i = 0; i < arr.length; i += batchSize) {
78
+ const batch = arr.slice(i, i + batchSize);
79
+ if (padding !== undefined && batch.length < batchSize) {
80
+ batch.push(...Array<T>(batchSize - batch.length).fill(padding));
81
+ }
82
+ output.push(batch);
83
+ }
84
+
85
+ return output;
86
+ }
87
+
88
+ export const sum = (arr: number[]): number => arr.reduce((a, b) => a + b, 0);
89
+
90
+ export const average = (arr: number[]): number =>
91
+ arr.length <= 0 ? 0 : sum(arr) / arr.length;
92
+
93
+ export const magnitude = (arr: number[]): number => Math.hypot(...arr);
94
+
95
+ export const normalizeSq = <Arr extends number[]>(arr: Arr): Arr => {
96
+ const mag = magnitude(arr);
97
+ if (Math.abs(mag) < 0.00000000000000001) return [...arr] as Arr;
98
+ return arr.map((x) => x / mag) as Arr;
99
+ };
100
+
101
+ // alias for normalizeSq
102
+ export const unit = <Arr extends number[]>(arr: Arr): Arr => normalizeSq(arr);
103
+
104
+ export const dot = (a: number[], b: number[]): number =>
105
+ sum(zipMin(a, b).map(([v1, v2]) => v1 * v2));
106
+
107
+ export const cross = (
108
+ a: number[] | Triple<number, number, number>,
109
+ b: number[] | Triple<number, number, number>,
110
+ ): Triple<number, number, number> => {
111
+ if (a.length !== 3)
112
+ throw new Error("cross() can only be used on 3-dimensional vectors");
113
+ if (b.length !== a.length)
114
+ throw new Error("both vectors must have the same length");
115
+
116
+ const ax = a[0]!;
117
+ const ay = a[1]!;
118
+ const az = a[2]!;
119
+
120
+ const bx = a[0]!;
121
+ const by = a[1]!;
122
+ const bz = a[2]!;
123
+
124
+ const x = ay * bz - az * by;
125
+ const y = az * bx - ax * bz;
126
+ const z = ax * by - ay * bx;
127
+
128
+ return [x, y, z];
129
+ };
130
+
131
+ export function add(a: V2, b: V2): V2;
132
+ export function add(a: V3, b: V3): V3;
133
+ export function add(a: number[], b: number[]): number[];
134
+ export function add(a: number[], b: number[]): number[] {
135
+ return zipMin(a, b).map(([v1, v2]) => v1 + v2);
136
+ }
137
+
138
+ export function sub(a: V2, b: V2): V2;
139
+ export function sub(a: V3, b: V3): V3;
140
+ export function sub(a: number[], b: number[]): number[];
141
+ export function sub(a: number[], b: number[]): number[] {
142
+ return zipMin(a, b).map(([v1, v2]) => v1 - v2);
143
+ }
144
+
145
+ export function mul(a: V2, b: V2): V2;
146
+ export function mul(a: V3, b: V3): V3;
147
+ export function mul(a: number[], b: number[]): number[];
148
+ export function mul(a: number[], b: number[]): number[] {
149
+ return zipMin(a, b).map(([v1, v2]) => v1 * v2);
150
+ }
151
+
152
+ export function div(a: V2, b: V2): V2;
153
+ export function div(a: V3, b: V3): V3;
154
+ export function div(a: number[], b: number[]): number[];
155
+ export function div(a: number[], b: number[]): number[] {
156
+ return zipMin(a, b).map(([v1, v2]) => v1 / v2);
157
+ }
158
+
159
+ export function scale(a: V2, s: number): V2;
160
+ export function scale(a: V3, s: number): V3;
161
+ export function scale(a: number[], s: number): number[];
162
+ export function scale(a: number[], s: number): number[] {
163
+ return a.map((v) => v * s);
164
+ }
165
+
166
+ export const distance = (a: number[], b: number[]): number =>
167
+ magnitude(sub(b, a));
168
+
169
+ export const cosineDistance = (a: number[], b: number[]): number => {
170
+ const dp = dot(a, b);
171
+ const magA = magnitude(a);
172
+ const magB = magnitude(b);
173
+ const result = dp / (magA * magB);
174
+ if (isNaN(result) || !isFinite(result)) return 0;
175
+ return result;
176
+ };
package/src/array.ts~ ADDED
File without changes
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./types";
2
+ export * from "./scalar";
3
+ export * from "./array";
4
+ export * from "./url";
package/src/index.ts~ ADDED
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export * from './scalar';
3
+ export * from './array';
4
+ export * from './url';
package/src/scalar.ts ADDED
@@ -0,0 +1,72 @@
1
+ export const clamp = (x: number, min: number, max: number): number =>
2
+ Math.max(min, Math.min(max, x));
3
+
4
+ export const lerp = (vFrom: number, vTo: number, scale: number) =>
5
+ vFrom + (vTo - vFrom) * scale;
6
+
7
+ export const remap = (
8
+ x: number,
9
+ range1: [number, number],
10
+ range2: [number, number],
11
+ ): number => {
12
+ const min1 = range1[0];
13
+ const max1 = range1[1];
14
+ const min2 = range2[0];
15
+ const max2 = range2[1];
16
+ const div = max1 - min1;
17
+
18
+ if (Math.abs(div) <= 0.00000000000000000001) return min2;
19
+
20
+ return min2 + ((clamp(x, min1, max1) - min1) / div) * (max2 - min2);
21
+ };
22
+
23
+ export const smoothstep = (
24
+ edge0: number,
25
+ edge1: number,
26
+ value: number,
27
+ ): number => {
28
+ const x = clamp((value - edge0) / (edge1 - edge0), 0.0, 1.0);
29
+ return x * x * (3.0 - 2.0 * x);
30
+ };
31
+
32
+ /**
33
+ * Smooth greater-than
34
+ */
35
+ export const sgt = (a: number, b: number, s: number) => {
36
+ const h = clamp(0.5 + (0.5 * (a - b)) / s, 0.0, 1.0);
37
+ return lerp(0.0, 1.0, h * h * (3.0 - 2.0 * h));
38
+ };
39
+
40
+ /**
41
+ * Smooth less-than
42
+ */
43
+ export const slt = (a: number, b: number, s: number) => {
44
+ const h = clamp(0.5 + (0.5 * (b - a)) / s, 0.0, 1.0);
45
+ return lerp(0.0, 1.0, h * h * (3.0 - 2.0 * h));
46
+ };
47
+
48
+ /**
49
+ * Smooth minimum
50
+ */
51
+ export const smin = (a: number, b: number, k: number) => {
52
+ const h = clamp(0.5 + (0.5 * (b - a)) / k, 0.0, 1.0);
53
+ return lerp(b, a, h) - k * h * (1.0 - h);
54
+ };
55
+
56
+ /**
57
+ * Smooth maximum
58
+ */
59
+ export const smax = (a: number, b: number, k: number) => {
60
+ const h = clamp(0.5 + (0.5 * (b - a)) / k, 0.0, 1.0);
61
+ return lerp(b, a, h) + k * h * (1.0 - h);
62
+ };
63
+
64
+ export const fract = (x: number) => x - Math.floor(x);
65
+
66
+ /**
67
+ * Absolute modulus
68
+ */
69
+ export const amod = (value: number, modulus: number): number =>
70
+ ((value % modulus) + modulus) % modulus;
71
+
72
+ export const sigmoid = (x: number) => 1 / (1 + Math.exp(-x));
package/src/scalar.ts~ ADDED
@@ -0,0 +1,72 @@
1
+ export const clamp = (x: number, min: number, max: number): number =>
2
+ Math.max(min, Math.min(max, x));
3
+
4
+ export const lerp = (vFrom: number, vTo: number, scale: number) =>
5
+ vFrom + (vTo - vFrom) * scale;
6
+
7
+ export const remap = (
8
+ x: number,
9
+ range1: [number, number],
10
+ range2: [number, number],
11
+ ): number => {
12
+ const min1 = range1[0];
13
+ const max1 = range1[1];
14
+ const min2 = range2[0];
15
+ const max2 = range2[1];
16
+ const div = max1 - min1;
17
+
18
+ if (Math.abs(div) <= 0.00000000000000000001) return min2;
19
+
20
+ return min2 + ((clamp(x, min1, max1) - min1) / div) * (max2 - min2);
21
+ };
22
+
23
+ export const smoothstep = (
24
+ edge0: number,
25
+ edge1: number,
26
+ value: number,
27
+ ): number => {
28
+ const x = clamp((value - edge0) / (edge1 - edge0), 0.0, 1.0);
29
+ return x * x * (3.0 - 2.0 * x);
30
+ };
31
+
32
+ /**
33
+ * Smooth greater-than
34
+ */
35
+ export const sgt = (a: number, b: number, s: number) => {
36
+ const h = clamp(0.5 + (0.5 * (a - b)) / s, 0.0, 1.0);
37
+ return lerp(0.0, 1.0, h * h * (3.0 - 2.0 * h));
38
+ };
39
+
40
+ /**
41
+ * Smooth less-than
42
+ */
43
+ export const slt = (a: number, b: number, s: number) => {
44
+ const h = clamp(0.5 + (0.5 * (b - a)) / s, 0.0, 1.0);
45
+ return lerp(0.0, 1.0, h * h * (3.0 - 2.0 * h));
46
+ };
47
+
48
+ /**
49
+ * Smooth minimum
50
+ */
51
+ export const smin = (a: number, b: number, k: number) => {
52
+ const h = clamp(0.5 + (0.5 * (b - a)) / k, 0.0, 1.0);
53
+ return lerp(b, a, h) - k * h * (1.0 - h);
54
+ };
55
+
56
+ /**
57
+ * Smooth maximum
58
+ */
59
+ export const smax = (a: number, b: number, k: number) => {
60
+ const h = clamp(0.5 + (0.5 * (b - a)) / k, 0.0, 1.0);
61
+ return lerp(b, a, h) + k * h * (1.0 - h);
62
+ };
63
+
64
+ export const fract = (x: number) => x - Math.floor(x);
65
+
66
+ /**
67
+ * Absolute modulus
68
+ */
69
+ export const amod = (value: number, modulus: number): number =>
70
+ ((value % modulus) + modulus) % modulus;
71
+
72
+ export const sigmoid = (x: number) => 1 / (1 + Math.exp(-x));
package/src/types.ts ADDED
@@ -0,0 +1,14 @@
1
+ export type Pair<A, B> = [A, B];
2
+ export type Triple<A, B, C> = [A, B, C];
3
+
4
+ export type Prettify<T> = {
5
+ [K in keyof T]: T[K];
6
+ } & {};
7
+
8
+ export type V2 = [number, number];
9
+ export type V3 = [number, number, number];
10
+ export type V4 = [number, number, number, number];
11
+
12
+ export type TupleOf<T> = [T, ...T[]] | [...T[], T] | [T];
13
+
14
+ export type Arrayish<T> = TupleOf<T> | Array<T>;
package/src/types.ts~ ADDED
File without changes
package/src/url.ts ADDED
@@ -0,0 +1,5 @@
1
+ export const urlEncode = <T extends Record<string, unknown>>(
2
+ params: T,
3
+ ): string => {
4
+ return new URLSearchParams(params as Record<string, string>).toString();
5
+ };
package/src/url.ts~ ADDED
@@ -0,0 +1,5 @@
1
+ export const urlEncode = <T extends Record<string, unknown>>(
2
+ params: T,
3
+ ): string => {
4
+ return new URLSearchParams(params as Record<string, string>).toString();
5
+ };
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist/cjs",
5
+ "module": "commonjs",
6
+ "moduleResolution": "node10"
7
+ },
8
+ "include": ["./src/**/*.ts"],
9
+ "exclude": ["./src/**/*.test.ts"]
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist/esm",
5
+ "module": "nodenext",
6
+ "target": "esnext"
7
+ },
8
+ "include": ["./src/**/*.ts"],
9
+ "exclude": ["./src/**/*.test.ts"]
10
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./src",
4
+ "outDir": "./dist",
5
+ "module": "nodenext",
6
+ "target": "esnext",
7
+ "lib": ["esnext", "es2020"],
8
+ "types": ["node"],
9
+ "sourceMap": true,
10
+ "declaration": true,
11
+ "declarationMap": true,
12
+ "noUncheckedIndexedAccess": true,
13
+ "exactOptionalPropertyTypes": true,
14
+ "strict": true,
15
+ "isolatedModules": true,
16
+ "esModuleInterop": true,
17
+ "noUncheckedSideEffectImports": true,
18
+ "moduleDetection": "force",
19
+ "skipLibCheck": true
20
+ },
21
+ "include": ["./src/**/*.ts"],
22
+ "exclude": ["./src/**/*.test.ts"]
23
+ }
package/tsconfig.json~ ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./src",
4
+ "outDir": "./dist",
5
+ "module": "nodenext",
6
+ "target": "esnext",
7
+ "lib": ["esnext"],
8
+ "types": ["node"],
9
+ "sourceMap": true,
10
+ "declaration": true,
11
+ "declarationMap": true,
12
+ "noUncheckedIndexedAccess": true,
13
+ "exactOptionalPropertyTypes": true,
14
+ "strict": true,
15
+ "isolatedModules": true,
16
+ "esModuleInterop": true,
17
+ "noUncheckedSideEffectImports": true,
18
+ "moduleDetection": "force",
19
+ "skipLibCheck": true
20
+ },
21
+ "include": ["./src/**/*.ts"],
22
+ "exclude": ["./src/**/*.test.ts"]
23
+ }