solid-new-bucket 0.0.1 → 0.0.3

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/dist/index.mjs ADDED
@@ -0,0 +1,323 @@
1
+ // src/arrayHelpers.ts
2
+ function removeElementsFromArray(arr, filter) {
3
+ const idx = [];
4
+ arr.forEach((t, i) => {
5
+ if (filter(t)) {
6
+ idx.push(i);
7
+ }
8
+ });
9
+ return idx.map((i) => arr.splice(i, 1)[0]);
10
+ }
11
+ function copyOfRange(arr, start, end) {
12
+ const r = [];
13
+ start = Math.max(0, start);
14
+ end = Math.min(arr.length, end);
15
+ for (let i = start; i < end; i++) {
16
+ r.push(arr[i]);
17
+ }
18
+ return r;
19
+ }
20
+ function indexOf(arr, test) {
21
+ for (let i = 0; i < arr.length; i++) {
22
+ if (test(arr[i])) {
23
+ return i;
24
+ }
25
+ }
26
+ return -1;
27
+ }
28
+
29
+ // src/buckets.ts
30
+ import { createSignal, createMemo, splitProps } from "solid-js";
31
+ function stampedBucket(value, options) {
32
+ if (options?.localStorageName) {
33
+ const raw = localStorage.getItem(options.localStorageName);
34
+ if (raw) {
35
+ value = JSON.parse(raw);
36
+ }
37
+ }
38
+ const [timestamp, setTimestamp] = createSignal((/* @__PURE__ */ new Date()).getTime());
39
+ const v = createMemo(() => {
40
+ return {
41
+ timestamp: timestamp(),
42
+ data: value,
43
+ markChanged() {
44
+ setTimestamp((/* @__PURE__ */ new Date()).getTime());
45
+ }
46
+ };
47
+ });
48
+ const setV = (newValue) => {
49
+ if (newValue) {
50
+ value = newValue;
51
+ }
52
+ setTimestamp((/* @__PURE__ */ new Date()).getTime());
53
+ };
54
+ const call = function(updater) {
55
+ if (updater) {
56
+ options?.beforeUpdate?.(value);
57
+ updater(value);
58
+ if (options?.localStorageName) {
59
+ localStorage.setItem(options.localStorageName, value ? JSON.stringify(value) : "");
60
+ }
61
+ setV();
62
+ options?.afterUpdate?.(value);
63
+ }
64
+ call.map = (mapper) => {
65
+ return mapper(v().data);
66
+ };
67
+ call.markChanged = () => {
68
+ setTimestamp((/* @__PURE__ */ new Date()).getTime());
69
+ };
70
+ call.reset = (v2) => {
71
+ setV(v2);
72
+ };
73
+ return v().data;
74
+ };
75
+ return call;
76
+ }
77
+ function getFieldOfObject(o, paths) {
78
+ for (let i = 0; i < paths.length - 1; i++) {
79
+ o = o[paths[i]];
80
+ if (!o) {
81
+ throw new Error(`cannot find ${paths.join(".")} in ${o}`);
82
+ }
83
+ }
84
+ return o[paths[paths.length - 1]];
85
+ }
86
+ function setFieldOfObject(o, newValue, paths) {
87
+ for (let i = 0; i < paths.length - 1; i++) {
88
+ o = o[paths[i]];
89
+ if (!o) {
90
+ throw new Error(`cannot find ${paths.join(".")} in ${o}`);
91
+ }
92
+ }
93
+ o[paths[paths.length - 1]] = newValue;
94
+ }
95
+ function asBucket(s, path, mapper) {
96
+ const getField = (data) => {
97
+ let v = getFieldOfObject(data, path);
98
+ return mapper ? mapper.from?.(v) : v;
99
+ };
100
+ const setField = (data, v) => {
101
+ if (mapper) {
102
+ v = mapper.to?.(v);
103
+ }
104
+ setFieldOfObject(data, v, path);
105
+ };
106
+ return (t) => {
107
+ if (t != void 0) {
108
+ s((data) => {
109
+ if (typeof t === "function") {
110
+ const oldValue = getField(data);
111
+ setField(data, t(oldValue));
112
+ } else {
113
+ setField(data, t);
114
+ }
115
+ });
116
+ }
117
+ return getField(s());
118
+ };
119
+ }
120
+ function asAccessor(v, k) {
121
+ return () => {
122
+ if (typeof v === "function") {
123
+ return v()[k];
124
+ }
125
+ return v[k];
126
+ };
127
+ }
128
+ function bucket(value, options) {
129
+ if (options?.useValueAsAccessor && typeof value === "function") {
130
+ const [_, others2] = splitProps(options, ["useValueAsAccessor"]);
131
+ const memo = createMemo(() => bucket(value(), others2));
132
+ return (t) => {
133
+ return memo()(t);
134
+ };
135
+ }
136
+ const [local, others] = options && splitProps(options, ["beforeUpdate", "afterUpdate", "localStorageName"]) || [];
137
+ if (local?.localStorageName) {
138
+ const raw = localStorage.getItem(local.localStorageName);
139
+ if (raw) {
140
+ value = JSON.parse(raw);
141
+ }
142
+ }
143
+ const [v, setV] = createSignal(value, others);
144
+ return (t) => {
145
+ if (t !== void 0) {
146
+ const newValue = setV((prev) => {
147
+ local?.beforeUpdate?.(prev);
148
+ if (typeof t === "function") {
149
+ return t(prev);
150
+ } else {
151
+ return t;
152
+ }
153
+ });
154
+ if (local?.localStorageName) {
155
+ localStorage.setItem(local.localStorageName, t ? JSON.stringify(t) : "");
156
+ }
157
+ local?.afterUpdate?.(newValue);
158
+ return newValue;
159
+ }
160
+ return v();
161
+ };
162
+ }
163
+
164
+ // src/checks.ts
165
+ function isNotEmpty(v) {
166
+ if (!v) return false;
167
+ if (typeof v === "string") {
168
+ return v.length > 0;
169
+ }
170
+ if (typeof v === "object") {
171
+ if (Array.isArray(v)) {
172
+ return v.length > 0;
173
+ }
174
+ return Object.keys(v).length > 0;
175
+ }
176
+ return false;
177
+ }
178
+ function isNumber(v) {
179
+ return typeof v === "number";
180
+ }
181
+ function compareDateString(a, b) {
182
+ return Date.parse(a) - Date.parse(b);
183
+ }
184
+ function containsAny(a, b) {
185
+ for (let i of a) {
186
+ for (let j of b) {
187
+ if (i === j) {
188
+ return true;
189
+ }
190
+ }
191
+ }
192
+ return false;
193
+ }
194
+
195
+ // src/wrappers.ts
196
+ function wrapDateNumber(v, bits = 2) {
197
+ if (v == 0) {
198
+ return "0".repeat(bits);
199
+ }
200
+ let n = v;
201
+ while (n > 0) {
202
+ n = Math.floor(n / 10);
203
+ bits--;
204
+ }
205
+ return bits > 0 ? "0".repeat(bits) + v : v;
206
+ }
207
+ function wrapString(v) {
208
+ if (typeof v === "string") {
209
+ return v;
210
+ }
211
+ return v?.toString() || "";
212
+ }
213
+ function wrapNumber(v) {
214
+ if (typeof v === "number") {
215
+ return v;
216
+ }
217
+ return 0;
218
+ }
219
+
220
+ // src/converters.ts
221
+ function parseTimestamp(timestamp, showTime, showMilliseconds) {
222
+ const date = new Date(timestamp);
223
+ let r = `${wrapDateNumber(date.getFullYear())}-${wrapDateNumber(date.getMonth() + 1)}-${wrapDateNumber(date.getDate())}`;
224
+ if (showTime) {
225
+ r += ` ${wrapDateNumber(date.getHours())}:${wrapDateNumber(date.getMinutes())}:${wrapDateNumber(date.getSeconds())}`;
226
+ }
227
+ if (showMilliseconds) {
228
+ r += `.${wrapDateNumber(date.getMilliseconds(), 3)}`;
229
+ }
230
+ ;
231
+ return r;
232
+ }
233
+ function toCapital(v) {
234
+ return v.charAt(0).toUpperCase() + v.substring(1);
235
+ }
236
+
237
+ // src/generators.ts
238
+ function sequence(start, end, step = 1) {
239
+ const r = [];
240
+ for (let i = start; i < end; i += step) {
241
+ r.push(i);
242
+ }
243
+ return r;
244
+ }
245
+ function iterate(size) {
246
+ return Array.from(Array(size).keys());
247
+ }
248
+
249
+ // src/others.ts
250
+ import { useContext } from "solid-js";
251
+ function useCtx(c) {
252
+ const context = useContext(c);
253
+ if (!context) {
254
+ throw new Error("cannot find a " + JSON.stringify(c));
255
+ }
256
+ return context;
257
+ }
258
+ function names(...v) {
259
+ return v.filter((name) => Boolean(name)).join(" ");
260
+ }
261
+ function clone(obj) {
262
+ const type = typeof obj;
263
+ switch (type) {
264
+ case "object": {
265
+ let r = Array.isArray(obj) ? [] : {};
266
+ for (let key of Object.keys(obj)) {
267
+ r[key] = clone(obj[key]);
268
+ }
269
+ return r;
270
+ }
271
+ default:
272
+ return obj;
273
+ }
274
+ }
275
+
276
+ // src/conditionals.ts
277
+ function conditional(condition, value, defaultValue) {
278
+ if (typeof value === "function") {
279
+ if (condition) {
280
+ const r = value();
281
+ if (r) {
282
+ return r;
283
+ }
284
+ }
285
+ return defaultValue;
286
+ }
287
+ if (typeof (value === "string")) {
288
+ return condition ? value : defaultValue || "";
289
+ }
290
+ if (typeof value === "number") {
291
+ return condition ? value : defaultValue || 0;
292
+ }
293
+ if (condition) {
294
+ return value;
295
+ } else if (defaultValue !== void 0 && defaultValue !== null) {
296
+ return defaultValue;
297
+ }
298
+ }
299
+ export {
300
+ asAccessor,
301
+ asBucket,
302
+ bucket,
303
+ clone,
304
+ compareDateString,
305
+ conditional,
306
+ containsAny,
307
+ copyOfRange,
308
+ indexOf,
309
+ isNotEmpty,
310
+ isNumber,
311
+ iterate,
312
+ names,
313
+ parseTimestamp,
314
+ removeElementsFromArray,
315
+ sequence,
316
+ stampedBucket,
317
+ toCapital,
318
+ useCtx,
319
+ wrapDateNumber,
320
+ wrapNumber,
321
+ wrapString
322
+ };
323
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/arrayHelpers.ts","../src/buckets.ts","../src/checks.ts","../src/wrappers.ts","../src/converters.ts","../src/generators.ts","../src/others.ts","../src/conditionals.ts"],"sourcesContent":["\n/**\n * Filter out and remove elements from array.\n * @param arr array\n * @param filter filter\n * @returns new array\n */\nexport function removeElementsFromArray<T>(arr: T[], filter: (t: T) => boolean): T[] {\n const idx: number[] = [];\n arr.forEach((t, i) => {\n if (filter(t)) {\n idx.push(i);\n }\n });\n return idx.map(i => arr.splice(i, 1)[0]);\n}\n\n/**\n * Copy range or array.\n * @param arr array\n * @param start start pos\n * @param end end pos\n * @returns sub range of array\n */\nexport function copyOfRange<T>(arr: T[], start: number, end: number): T[] {\n const r: T[] = [];\n start = Math.max(0, start);\n end = Math.min(arr.length, end);\n for (let i = start; i < end; i++) {\n r.push(arr[i]);\n }\n return r;\n}\n\n/**\n * Find first element in array which passes test.\n * @param arr array\n * @param test test\n * @returns index\n */\nexport function indexOf<T>(arr: T[], test: Func<T, boolean>) {\n for (let i = 0; i < arr.length; i++) {\n if (test(arr[i])) {\n return i;\n }\n }\n return -1;\n}\n","import { createSignal, Accessor, createMemo, SignalOptions, splitProps } from \"solid-js\"\n\n\n/**\n * Stamped Bucket help to trigger rerendering after updating object without recreate new object.\n * @returns StampedBucket<T>\n */\nexport function stampedBucket<T>(value: T, options?: {\n beforeUpdate?: (value: T) => void;\n afterUpdate?: (value: T) => void;\n localStorageName?: string;\n}): StampedBucket<T> {\n // load from local storage\n if (options?.localStorageName) {\n const raw = localStorage.getItem(options.localStorageName);\n if (raw) {\n value = JSON.parse(raw);\n }\n }\n\n const [timestamp, setTimestamp] = createSignal(new Date().getTime());\n const v: Accessor<StampedData<T>> = createMemo(() => {\n return {\n timestamp: timestamp(),\n data: value,\n markChanged() {\n setTimestamp(new Date().getTime());\n }\n };\n });\n const setV = (newValue?: T) => {\n if (newValue) {\n value = newValue\n }\n setTimestamp(new Date().getTime())\n };\n\n const call = function(updater?: (v: T) => void) {\n if (updater) {\n options?.beforeUpdate?.(value)\n\n updater(value)\n\n // save to local storage\n if (options?.localStorageName) {\n localStorage.setItem(options.localStorageName, value ? JSON.stringify(value) : \"\")\n }\n setV();\n \n options?.afterUpdate?.(value)\n }\n\n // add mapper function\n (call as any).map = <O>(mapper: (v: T) => O) => {\n return mapper(v().data);\n }\n\n // add markChanged function\n (call as any).markChanged = () => {\n setTimestamp(new Date().getTime())\n }\n\n (call as any).reset = (v: T) => {\n setV(v)\n }\n\n return v().data\n }\n\n return call as any\n}\n\nfunction getFieldOfObject(o: any, paths: ObjectIndex[]) {\n for (let i = 0; i < paths.length - 1; i++) {\n o = o[paths[i]];\n if (!o) {\n throw new Error(`cannot find ${paths.join('.')} in ${o}`)\n }\n }\n return o[paths[paths.length - 1]]\n}\n\nfunction setFieldOfObject(o: any, newValue: any, paths: ObjectIndex[]) {\n for (let i = 0; i < paths.length - 1; i++) {\n o = o[paths[i]];\n if (!o) {\n throw new Error(`cannot find ${paths.join('.')} in ${o}`)\n }\n }\n o[paths[paths.length - 1]] = newValue\n}\n\nexport function asBucket<O, FieldType, DecadeType>(s: StampedBucket<O>, path: ObjectIndex[], mapper?: Mapper<FieldType, DecadeType>): Bucket<FieldType> {\n const getField = (data: O) => {\n let v = getFieldOfObject(data, path)\n return mapper ? mapper.from?.(v) : v\n }\n const setField = (data: O, v: any) => {\n if (mapper) {\n v = mapper.to?.(v)\n }\n setFieldOfObject(data, v, path)\n }\n return (t) => {\n if (t != undefined) {\n s(data => {\n if (typeof(t) === \"function\") {\n const oldValue = getField(data)\n // @ts-ignore\n setField(data, t(oldValue))\n } else {\n setField(data, t)\n }\n })\n\n }\n return getField(s())\n }\n}\n\nexport function asAccessor<T, K extends (keyof T)>(v: T | Accessor<T>, k: K): Accessor<T[K]> {\n return () => {\n if (typeof(v) === \"function\") {\n return (v as Function)()[k]\n }\n return v[k]\n }\n}\n\n/**\n * Create a bucket to track data.\n * @param value value or Accessor of value\n * @param options options\n * @returns Bucket<T>\n */\nexport function bucket<T>(value: T | Accessor<T>, options?: {\n useValueAsAccessor?: boolean\n beforeUpdate?: (newValue: T) => void\n afterUpdate?: (newValue: T) => void\n localStorageName?: string;\n} & SignalOptions<T>): Bucket<T> {\n if (options?.useValueAsAccessor && typeof(value) === \"function\") {\n const [_, others] = splitProps(options, [\"useValueAsAccessor\"])\n const memo = createMemo(() => bucket<T>((value as any)(), others))\n return (t) => {\n // @ts-ignore\n return memo()(t)\n }\n }\n \n const [local, others] = options && splitProps(options, [\"beforeUpdate\", \"afterUpdate\", \"localStorageName\"]) || [];\n\n // load from local storage\n if (local?.localStorageName) {\n const raw = localStorage.getItem(local.localStorageName);\n if (raw) {\n value = JSON.parse(raw);\n }\n }\n\n // @ts-ignore\n const [v, setV] = createSignal<T>(value, others)\n\n return (t) => {\n if (t !== undefined) {\n const newValue = setV((prev) => {\n local?.beforeUpdate?.(prev);\n if (typeof(t) === \"function\") {\n return (t as Function)(prev);\n } else {\n return t;\n }\n });\n // save to local storage\n if (local?.localStorageName) {\n localStorage.setItem(local.localStorageName, t ? JSON.stringify(t) : \"\");\n }\n local?.afterUpdate?.(newValue);\n return newValue;\n }\n return v()\n };\n}\n","\n/**\n * Check if array or string is not empty.\n * @param v array of any, string or undefined\n * @returns true if target is not empty\n */\nexport function isNotEmpty<T>(v?: T[]): boolean\nexport function isNotEmpty(v?: string): boolean\nexport function isNotEmpty(v: any) {\n if (!v) return false\n if (typeof(v) === \"string\") {\n return v.length > 0\n }\n if (typeof(v) === \"object\") {\n if (Array.isArray(v)) {\n return v.length > 0\n }\n return Object.keys(v).length > 0\n }\n return false\n}\n\n/**\n * Check if value is number.\n * @param v any\n * @returns true if value is number\n */\nexport function isNumber(v: any) {\n return typeof(v) === \"number\";\n}\n\n/**\n * Compare two date string.\n * @param a date 1\n * @param b date 2\n * @returns true if a is later than b\n */\nexport function compareDateString(a: string, b: string): number {\n return Date.parse(a) - Date.parse(b);\n}\n\n/**\n * Check whether there is an element in b exists in a as well.\n * @param a array 1\n * @param b array 2\n * @returns boolean\n */\nexport function containsAny(a: any[], b: any[]) {\n for (let i of a) {\n for (let j of b) {\n if (i === j) {\n return true;\n }\n }\n }\n return false;\n}\n","\n\nexport function wrapDateNumber(v: number, bits: number = 2) {\n if (v == 0) {\n return '0'.repeat(bits);\n }\n \n let n = v;\n while (n > 0) {\n n = Math.floor(n / 10);\n bits--;\n }\n return bits > 0 ? '0'.repeat(bits) + v : v;\n}\n\nexport function wrapString(v: any): string {\n if (typeof(v) === \"string\") {\n return v;\n }\n return v?.toString() || \"\";\n}\n\nexport function wrapNumber(v: any) {\n if (typeof(v) === \"number\") {\n return v;\n }\n return 0;\n}\n","import { wrapDateNumber } from \"./wrappers\";\n\n/**\n * Parse and format timestamp from number to string.\n * @param timestamp time\n * @param showTime show only date if false\n * @param showMilliseconds show ms if true\n * @returns formatted string\n */\nexport function parseTimestamp(timestamp: number, showTime?: boolean, showMilliseconds?: boolean) {\n const date = new Date(timestamp);\n // TODO: toLocaleString\n // return date.toLocaleString(undefined, {\n // });\n let r = `${wrapDateNumber(date.getFullYear())}-${wrapDateNumber(date.getMonth() + 1)}-${wrapDateNumber(date.getDate())}`;\n if (showTime) {\n r += ` ${wrapDateNumber(date.getHours())}:${wrapDateNumber(date.getMinutes())}:${wrapDateNumber(date.getSeconds())}`;\n }\n if (showMilliseconds) {\n r += `.${wrapDateNumber(date.getMilliseconds(), 3)}`;\n };\n return r;\n}\n\nexport function toCapital(v: string) {\n return v.charAt(0).toUpperCase() + v.substring(1);\n}","\n/**\n * Genereate a sequence.\n * @param start start\n * @param end end\n * @param step step\n * @returns array\n */\nexport function sequence(start: number, end: number, step: number = 1) {\n const r = [];\n for (let i = start; i < end; i += step) {\n r.push(i);\n }\n return r;\n}\n\n/**\n * Generate a array of size.\n * @param size size\n * @returns \n */\nexport function iterate(size: number) {\n return Array.from(Array(size).keys())\n}","import { Context, useContext } from \"solid-js\";\n\nexport function useCtx<T>(c: Context<T>): T {\n const context = useContext(c);\n if (!context) {\n throw new Error(\"cannot find a \" + JSON.stringify(c))\n }\n return context;\n}\n\nexport function names(...v: (string | undefined)[]) {\n return v.filter((name) => Boolean(name)).join(' ');\n}\n\nexport function clone(obj: any) {\n const type = typeof(obj);\n switch (type) {\n case 'object': {\n let r: any = Array.isArray(obj) ? [] : {};\n for (let key of Object.keys(obj)) {\n r[key] = clone(obj[key]);\n }\n return r;\n }\n default:\n return obj;\n }\n}\n","\n/**\n * Invoke function or return value if condition is true.\n * @param condition any\n * @param value function to be invoked or value to be return\n * @param defaultValue fallback value, optional\n */\nexport function conditional<T>(condition: any, value: () => void): void;\nexport function conditional<T>(condition: any, value: T, defaultValue?: T): T;\nexport function conditional<T>(condition: any, value: Supplier<T>, defaultValue?: T): T;\nexport function conditional(condition: any, value: any, defaultValue?: any) {\n if (typeof(value) === \"function\") {\n if (condition) {\n const r = value()\n if (r) {\n return r\n }\n }\n return defaultValue\n }\n\n if (typeof(value === \"string\")) {\n return condition ? value : (defaultValue || '')\n }\n\n if (typeof(value) === \"number\") {\n return condition ? value : (defaultValue || 0)\n }\n\n if (condition) {\n return value\n } else if (defaultValue !== undefined && defaultValue !== null) {\n return defaultValue\n }\n}\n"],"mappings":"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","names":["v","others"]}
package/package.json CHANGED
@@ -1,16 +1,23 @@
1
1
  {
2
2
  "name": "solid-new-bucket",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Better Signal API for SolidJS",
5
5
  "scripts": {
6
6
  "start": "vite",
7
7
  "dev": "vite",
8
- "build": "vite build",
8
+ "build": "tsup",
9
9
  "serve": "vite preview"
10
10
  },
11
11
  "license": "GNU",
12
+ "main": "./dist/index.js",
13
+ "module": "./dist/index.mjs",
14
+ "types": "./dist/index.d.ts",
15
+ "files": [
16
+ "dist"
17
+ ],
12
18
  "devDependencies": {
13
19
  "solid-devtools": "^0.27.3",
20
+ "tsup": "^8.1.0",
14
21
  "typescript": "^5.1.3",
15
22
  "vite": "^4.3.9",
16
23
  "vite-plugin-solid": "^2.7.0"
package/app/index.tsx DELETED
@@ -1,12 +0,0 @@
1
- /* @refresh reload */
2
- import { render } from 'solid-js/web';
3
-
4
- const root = document.getElementById('root');
5
-
6
- if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
7
- throw new Error(
8
- 'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?',
9
- );
10
- }
11
-
12
- render(() => 'app', root!);
package/index.html DELETED
@@ -1,16 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <meta name="theme-color" content="#000000" />
7
- <link rel="shortcut icon" type="image/ico" href="/app/assets/favicon.ico" />
8
- <title>Solid App</title>
9
- </head>
10
- <body>
11
- <noscript>You need to enable JavaScript to run this app.</noscript>
12
- <div id="root"></div>
13
-
14
- <script src="/app/index.tsx" type="module"></script>
15
- </body>
16
- </html>
@@ -1,48 +0,0 @@
1
-
2
- /**
3
- * Filter out and remove elements from array.
4
- * @param arr array
5
- * @param filter filter
6
- * @returns new array
7
- */
8
- export function removeElementsFromArray<T>(arr: T[], filter: (t: T) => boolean): T[] {
9
- const idx: number[] = [];
10
- arr.forEach((t, i) => {
11
- if (filter(t)) {
12
- idx.push(i);
13
- }
14
- });
15
- return idx.map(i => arr.splice(i, 1)[0]);
16
- }
17
-
18
- /**
19
- * Copy range or array.
20
- * @param arr array
21
- * @param start start pos
22
- * @param end end pos
23
- * @returns sub range of array
24
- */
25
- export function copyOfRange<T>(arr: T[], start: number, end: number): T[] {
26
- const r: T[] = [];
27
- start = Math.max(0, start);
28
- end = Math.min(arr.length, end);
29
- for (let i = start; i < end; i++) {
30
- r.push(arr[i]);
31
- }
32
- return r;
33
- }
34
-
35
- /**
36
- * Find first element in array which passes test.
37
- * @param arr array
38
- * @param test test
39
- * @returns index
40
- */
41
- export function indexOf<T>(arr: T[], test: Func<T, boolean>) {
42
- for (let i = 0; i < arr.length; i++) {
43
- if (test(arr[i])) {
44
- return i;
45
- }
46
- }
47
- return -1;
48
- }
package/src/buckets.ts DELETED
@@ -1,182 +0,0 @@
1
- import { createSignal, Accessor, createMemo, SignalOptions, splitProps } from "solid-js";
2
-
3
- /**
4
- * Stamped Bucket help to trigger rerendering after updating object without recreate new object.
5
- * @returns StampedBucket<T>
6
- */
7
- export function stampedBucket<T>(value: T, options?: {
8
- beforeUpdate?: (value: T) => void;
9
- afterUpdate?: (value: T) => void;
10
- localStorageName?: string;
11
- }): StampedBucket<T> {
12
- // load from local storage
13
- if (options?.localStorageName) {
14
- const raw = localStorage.getItem(options.localStorageName);
15
- if (raw) {
16
- value = JSON.parse(raw);
17
- }
18
- }
19
-
20
- const [timestamp, setTimestamp] = createSignal(new Date().getTime());
21
- const v: Accessor<StampedData<T>> = createMemo(() => {
22
- return {
23
- timestamp: timestamp(),
24
- data: value,
25
- markChanged() {
26
- setTimestamp(new Date().getTime());
27
- }
28
- };
29
- });
30
- const setV = (newValue?: T) => {
31
- if (newValue) {
32
- value = newValue
33
- }
34
- setTimestamp(new Date().getTime())
35
- };
36
-
37
- const call = function(updater?: (v: T) => void) {
38
- if (updater) {
39
- options?.beforeUpdate?.(value)
40
-
41
- updater(value)
42
-
43
- // save to local storage
44
- if (options?.localStorageName) {
45
- localStorage.setItem(options.localStorageName, value ? JSON.stringify(value) : "")
46
- }
47
- setV();
48
-
49
- options?.afterUpdate?.(value)
50
- }
51
-
52
- // add mapper function
53
- (call as any).map = <O>(mapper: (v: T) => O) => {
54
- return mapper(v().data);
55
- }
56
-
57
- // add markChanged function
58
- (call as any).markChanged = () => {
59
- setTimestamp(new Date().getTime())
60
- }
61
-
62
- (call as any).reset = (v: T) => {
63
- setV(v)
64
- }
65
-
66
- return v().data
67
- }
68
-
69
- return call as any
70
- }
71
-
72
- function getFieldOfObject(o: any, paths: ObjectIndex[]) {
73
- for (let i = 0; i < paths.length - 1; i++) {
74
- o = o[paths[i]];
75
- if (!o) {
76
- throw new Error(`cannot find ${paths.join('.')} in ${o}`)
77
- }
78
- }
79
- return o[paths[paths.length - 1]]
80
- }
81
-
82
- function setFieldOfObject(o: any, newValue: any, paths: ObjectIndex[]) {
83
- for (let i = 0; i < paths.length - 1; i++) {
84
- o = o[paths[i]];
85
- if (!o) {
86
- throw new Error(`cannot find ${paths.join('.')} in ${o}`)
87
- }
88
- }
89
- o[paths[paths.length - 1]] = newValue
90
- }
91
-
92
- export function asBucket<O, FieldType, DecadeType>(s: StampedBucket<O>, path: ObjectIndex[], mapper?: Mapper<FieldType, DecadeType>): Bucket<FieldType> {
93
- const getField = (data: O) => {
94
- let v = getFieldOfObject(data, path)
95
- return mapper ? mapper.from?.(v) : v
96
- }
97
- const setField = (data: O, v: any) => {
98
- if (mapper) {
99
- v = mapper.to?.(v)
100
- }
101
- setFieldOfObject(data, v, path)
102
- }
103
- return (t) => {
104
- if (t != undefined) {
105
- s(data => {
106
- if (typeof(t) === "function") {
107
- const oldValue = getField(data)
108
- // @ts-ignore
109
- setField(data, t(oldValue))
110
- } else {
111
- setField(data, t)
112
- }
113
- })
114
-
115
- }
116
- return getField(s())
117
- }
118
- }
119
-
120
- export function asAccessor<T, K extends (keyof T)>(v: T | Accessor<T>, k: K): Accessor<T[K]> {
121
- return () => {
122
- if (typeof(v) === "function") {
123
- return (v as Function)()[k]
124
- }
125
- return v[k]
126
- }
127
- }
128
-
129
- /**
130
- * Create a bucket to track data.
131
- * @param value value or Accessor of value
132
- * @param options options
133
- * @returns Bucket<T>
134
- */
135
- export function bucket<T>(value: T | Accessor<T>, options?: {
136
- useValueAsAccessor?: boolean
137
- beforeUpdate?: (newValue: T) => void
138
- afterUpdate?: (newValue: T) => void
139
- localStorageName?: string;
140
- } & SignalOptions<T>): Bucket<T> {
141
- if (options?.useValueAsAccessor && typeof(value) === "function") {
142
- const [_, others] = splitProps(options, ["useValueAsAccessor"])
143
- const memo = createMemo(() => bucket<T>((value as any)(), others))
144
- return (t) => {
145
- // @ts-ignore
146
- return memo()(t)
147
- }
148
- }
149
-
150
- const [local, others] = options && splitProps(options, ["beforeUpdate", "afterUpdate", "localStorageName"]) || [];
151
-
152
- // load from local storage
153
- if (local?.localStorageName) {
154
- const raw = localStorage.getItem(local.localStorageName);
155
- if (raw) {
156
- value = JSON.parse(raw);
157
- }
158
- }
159
-
160
- // @ts-ignore
161
- const [v, setV] = createSignal<T>(value, others)
162
-
163
- return (t) => {
164
- if (t !== undefined) {
165
- const newValue = setV((prev) => {
166
- local?.beforeUpdate?.(prev);
167
- if (typeof(t) === "function") {
168
- return (t as Function)(prev);
169
- } else {
170
- return t;
171
- }
172
- });
173
- // save to local storage
174
- if (local?.localStorageName) {
175
- localStorage.setItem(local.localStorageName, t ? JSON.stringify(t) : "");
176
- }
177
- local?.afterUpdate?.(newValue);
178
- return newValue;
179
- }
180
- return v()
181
- };
182
- }