radashi 12.1.0

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 (44) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +38 -0
  3. package/dist/cjs/array.cjs +281 -0
  4. package/dist/cjs/array.cjs.map +1 -0
  5. package/dist/cjs/async.cjs +169 -0
  6. package/dist/cjs/async.cjs.map +1 -0
  7. package/dist/cjs/curry.cjs +113 -0
  8. package/dist/cjs/curry.cjs.map +1 -0
  9. package/dist/cjs/index.cjs +109 -0
  10. package/dist/cjs/index.cjs.map +1 -0
  11. package/dist/cjs/number.cjs +34 -0
  12. package/dist/cjs/number.cjs.map +1 -0
  13. package/dist/cjs/object.cjs +204 -0
  14. package/dist/cjs/object.cjs.map +1 -0
  15. package/dist/cjs/random.cjs +34 -0
  16. package/dist/cjs/random.cjs.map +1 -0
  17. package/dist/cjs/series.cjs +62 -0
  18. package/dist/cjs/series.cjs.map +1 -0
  19. package/dist/cjs/string.cjs +72 -0
  20. package/dist/cjs/string.cjs.map +1 -0
  21. package/dist/cjs/typed.cjs +104 -0
  22. package/dist/cjs/typed.cjs.map +1 -0
  23. package/dist/esm/array.mjs +251 -0
  24. package/dist/esm/array.mjs.map +1 -0
  25. package/dist/esm/async.mjs +158 -0
  26. package/dist/esm/async.mjs.map +1 -0
  27. package/dist/esm/curry.mjs +103 -0
  28. package/dist/esm/curry.mjs.map +1 -0
  29. package/dist/esm/index.mjs +10 -0
  30. package/dist/esm/index.mjs.map +1 -0
  31. package/dist/esm/number.mjs +30 -0
  32. package/dist/esm/number.mjs.map +1 -0
  33. package/dist/esm/object.mjs +186 -0
  34. package/dist/esm/object.mjs.map +1 -0
  35. package/dist/esm/random.mjs +29 -0
  36. package/dist/esm/random.mjs.map +1 -0
  37. package/dist/esm/series.mjs +60 -0
  38. package/dist/esm/series.mjs.map +1 -0
  39. package/dist/esm/string.mjs +63 -0
  40. package/dist/esm/string.mjs.map +1 -0
  41. package/dist/esm/typed.mjs +90 -0
  42. package/dist/esm/typed.mjs.map +1 -0
  43. package/dist/index.d.ts +682 -0
  44. package/package.json +54 -0
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ function chain(...funcs) {
4
+ return (...args) => {
5
+ return funcs.slice(1).reduce((acc, fn) => fn(acc), funcs[0](...args));
6
+ };
7
+ }
8
+ function compose(...funcs) {
9
+ return funcs.reverse().reduce((acc, fn) => fn(acc));
10
+ }
11
+ const partial = (fn, ...args) => {
12
+ return (...rest) => fn(...[...args, ...rest]);
13
+ };
14
+ const partob = (fn, argobj) => {
15
+ return (restobj) => fn({
16
+ ...argobj,
17
+ ...restobj
18
+ });
19
+ };
20
+ const proxied = (handler) => {
21
+ return new Proxy(
22
+ {},
23
+ {
24
+ get: (target, propertyName) => handler(propertyName)
25
+ }
26
+ );
27
+ };
28
+ const memoize = (cache, func, keyFunc, ttl) => {
29
+ return function callWithMemo(...args) {
30
+ const key = keyFunc ? keyFunc(...args) : JSON.stringify({ args });
31
+ const existing = cache[key];
32
+ if (existing !== void 0) {
33
+ if (!existing.exp)
34
+ return existing.value;
35
+ if (existing.exp > new Date().getTime()) {
36
+ return existing.value;
37
+ }
38
+ }
39
+ const result = func(...args);
40
+ cache[key] = {
41
+ exp: ttl ? new Date().getTime() + ttl : null,
42
+ value: result
43
+ };
44
+ return result;
45
+ };
46
+ };
47
+ const memo = (func, options = {}) => {
48
+ return memoize({}, func, options.key ?? null, options.ttl ?? null);
49
+ };
50
+ const debounce = ({ delay }, func) => {
51
+ let timer = void 0;
52
+ let active = true;
53
+ const debounced = (...args) => {
54
+ if (active) {
55
+ clearTimeout(timer);
56
+ timer = setTimeout(() => {
57
+ active && func(...args);
58
+ timer = void 0;
59
+ }, delay);
60
+ } else {
61
+ func(...args);
62
+ }
63
+ };
64
+ debounced.isPending = () => {
65
+ return timer !== void 0;
66
+ };
67
+ debounced.cancel = () => {
68
+ active = false;
69
+ };
70
+ debounced.flush = (...args) => func(...args);
71
+ return debounced;
72
+ };
73
+ const throttle = ({ interval }, func) => {
74
+ let ready = true;
75
+ let timer = void 0;
76
+ const throttled = (...args) => {
77
+ if (!ready)
78
+ return;
79
+ func(...args);
80
+ ready = false;
81
+ timer = setTimeout(() => {
82
+ ready = true;
83
+ timer = void 0;
84
+ }, interval);
85
+ };
86
+ throttled.isThrottled = () => {
87
+ return timer !== void 0;
88
+ };
89
+ return throttled;
90
+ };
91
+ const callable = (obj, fn) => {
92
+ const FUNC = () => {
93
+ };
94
+ return new Proxy(Object.assign(FUNC, obj), {
95
+ get: (target, key) => target[key],
96
+ set: (target, key, value) => {
97
+ target[key] = value;
98
+ return true;
99
+ },
100
+ apply: (target, self, args) => fn(Object.assign({}, target))(...args)
101
+ });
102
+ };
103
+
104
+ exports.callable = callable;
105
+ exports.chain = chain;
106
+ exports.compose = compose;
107
+ exports.debounce = debounce;
108
+ exports.memo = memo;
109
+ exports.partial = partial;
110
+ exports.partob = partob;
111
+ exports.proxied = proxied;
112
+ exports.throttle = throttle;
113
+ //# sourceMappingURL=curry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curry.cjs","sources":["../../src/curry.ts"],"sourcesContent":["declare const setTimeout: (fn: () => void, ms: number) => unknown\ndeclare const clearTimeout: (timer: unknown) => void\n\nexport function chain<T1 extends any[], T2, T3>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3\n): (...arg: T1) => T3\nexport function chain<T1 extends any[], T2, T3, T4>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4\n): (...arg: T1) => T4\nexport function chain<T1 extends any[], T2, T3, T4, T5>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5\n): (...arg: T1) => T5\nexport function chain<T1 extends any[], T2, T3, T4, T5, T6>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5,\n f5: (arg: T3) => T6\n): (...arg: T1) => T6\nexport function chain<T1 extends any[], T2, T3, T4, T5, T6, T7>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5,\n f5: (arg: T3) => T6,\n f6: (arg: T3) => T7\n): (...arg: T1) => T7\nexport function chain<T1 extends any[], T2, T3, T4, T5, T6, T7, T8>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5,\n f5: (arg: T3) => T6,\n f6: (arg: T3) => T7,\n f7: (arg: T3) => T8\n): (...arg: T1) => T8\nexport function chain<T1 extends any[], T2, T3, T4, T5, T6, T7, T8, T9>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5,\n f5: (arg: T3) => T6,\n f6: (arg: T3) => T7,\n f7: (arg: T3) => T8,\n f8: (arg: T3) => T9\n): (...arg: T1) => T9\nexport function chain<T1 extends any[], T2, T3, T4, T5, T6, T7, T8, T9, T10>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5,\n f5: (arg: T3) => T6,\n f6: (arg: T3) => T7,\n f7: (arg: T3) => T8,\n f8: (arg: T3) => T9,\n f9: (arg: T3) => T10\n): (...arg: T1) => T10\nexport function chain<\n T1 extends any[],\n T2,\n T3,\n T4,\n T5,\n T6,\n T7,\n T8,\n T9,\n T10,\n T11\n>(\n f1: (...arg: T1) => T2,\n f2: (arg: T2) => T3,\n f3: (arg: T3) => T4,\n f4: (arg: T3) => T5,\n f5: (arg: T3) => T6,\n f6: (arg: T3) => T7,\n f7: (arg: T3) => T8,\n f8: (arg: T3) => T9,\n f9: (arg: T3) => T10,\n f10: (arg: T3) => T11\n): (...arg: T1) => T11\nexport function chain(...funcs: ((...args: any[]) => any)[]) {\n return (...args: any[]) => {\n return funcs.slice(1).reduce((acc, fn) => fn(acc), funcs[0](...args))\n }\n}\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => LastResult\n ) => (...args: F1Args) => F1Result,\n last: (...args: F1NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2Result,\n F2NextArgs extends any[],\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => LastResult\n ) => (...args: F1NextArgs) => F2Result,\n last: (...args: F2NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => LastResult\n ) => (...args: F2NextArgs) => F3Result,\n last: (...args: F3NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n F4NextArgs extends any[],\n F4Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => F4Result\n ) => (...args: F2NextArgs) => F3Result,\n f4: (\n next: (...args: F4NextArgs) => LastResult\n ) => (...args: F3NextArgs) => F4Result,\n last: (...args: F4NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n F4NextArgs extends any[],\n F4Result,\n F5NextArgs extends any[],\n F5Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => F4Result\n ) => (...args: F2NextArgs) => F3Result,\n f4: (\n next: (...args: F4NextArgs) => F5Result\n ) => (...args: F3NextArgs) => F4Result,\n f5: (\n next: (...args: F5NextArgs) => LastResult\n ) => (...args: F4NextArgs) => F5Result,\n last: (...args: F5NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n F4NextArgs extends any[],\n F4Result,\n F5NextArgs extends any[],\n F5Result,\n F6NextArgs extends any[],\n F6Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => F4Result\n ) => (...args: F2NextArgs) => F3Result,\n f4: (\n next: (...args: F4NextArgs) => F5Result\n ) => (...args: F3NextArgs) => F4Result,\n f5: (\n next: (...args: F5NextArgs) => F6Result\n ) => (...args: F4NextArgs) => F5Result,\n f6: (\n next: (...args: F6NextArgs) => LastResult\n ) => (...args: F5NextArgs) => F6Result,\n last: (...args: F6NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n F4NextArgs extends any[],\n F4Result,\n F5NextArgs extends any[],\n F5Result,\n F6NextArgs extends any[],\n F6Result,\n F7NextArgs extends any[],\n F7Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => F4Result\n ) => (...args: F2NextArgs) => F3Result,\n f4: (\n next: (...args: F4NextArgs) => F5Result\n ) => (...args: F3NextArgs) => F4Result,\n f5: (\n next: (...args: F5NextArgs) => F6Result\n ) => (...args: F4NextArgs) => F5Result,\n f6: (\n next: (...args: F6NextArgs) => F7Result\n ) => (...args: F5NextArgs) => F6Result,\n f7: (\n next: (...args: F7NextArgs) => LastResult\n ) => (...args: F6NextArgs) => F7Result,\n last: (...args: F7NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n F4NextArgs extends any[],\n F4Result,\n F5NextArgs extends any[],\n F5Result,\n F6NextArgs extends any[],\n F6Result,\n F7NextArgs extends any[],\n F7Result,\n F8NextArgs extends any[],\n F8Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => F4Result\n ) => (...args: F2NextArgs) => F3Result,\n f4: (\n next: (...args: F4NextArgs) => F5Result\n ) => (...args: F3NextArgs) => F4Result,\n f5: (\n next: (...args: F5NextArgs) => F6Result\n ) => (...args: F4NextArgs) => F5Result,\n f6: (\n next: (...args: F6NextArgs) => F7Result\n ) => (...args: F5NextArgs) => F6Result,\n f7: (\n next: (...args: F7NextArgs) => LastResult\n ) => (...args: F6NextArgs) => F7Result,\n f8: (\n next: (...args: F8NextArgs) => LastResult\n ) => (...args: F7NextArgs) => F8Result,\n last: (...args: F8NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose<\n F1Result,\n F1Args extends any[],\n F1NextArgs extends any[],\n F2NextArgs extends any[],\n F2Result,\n F3NextArgs extends any[],\n F3Result,\n F4NextArgs extends any[],\n F4Result,\n F5NextArgs extends any[],\n F5Result,\n F6NextArgs extends any[],\n F6Result,\n F7NextArgs extends any[],\n F7Result,\n F8NextArgs extends any[],\n F8Result,\n F9NextArgs extends any[],\n F9Result,\n LastResult\n>(\n f1: (\n next: (...args: F1NextArgs) => F2Result\n ) => (...args: F1Args) => F1Result,\n f2: (\n next: (...args: F2NextArgs) => F3Result\n ) => (...args: F1NextArgs) => F2Result,\n f3: (\n next: (...args: F3NextArgs) => F4Result\n ) => (...args: F2NextArgs) => F3Result,\n f4: (\n next: (...args: F4NextArgs) => F5Result\n ) => (...args: F3NextArgs) => F4Result,\n f5: (\n next: (...args: F5NextArgs) => F6Result\n ) => (...args: F4NextArgs) => F5Result,\n f6: (\n next: (...args: F6NextArgs) => F7Result\n ) => (...args: F5NextArgs) => F6Result,\n f7: (\n next: (...args: F7NextArgs) => LastResult\n ) => (...args: F6NextArgs) => F7Result,\n f8: (\n next: (...args: F8NextArgs) => LastResult\n ) => (...args: F7NextArgs) => F8Result,\n f9: (\n next: (...args: F9NextArgs) => LastResult\n ) => (...args: F8NextArgs) => F9Result,\n last: (...args: F9NextArgs) => LastResult\n): (...args: F1Args) => F1Result\n\nexport function compose(...funcs: ((...args: any[]) => any)[]) {\n return funcs.reverse().reduce((acc, fn) => fn(acc))\n}\n\n/**\n * This type produces the type array of TItems with all the type items\n * in TItemsToRemove removed from the start of the array type.\n *\n * @example\n * ```\n * RemoveItemsInFront<[number, number], [number]> = [number]\n * RemoveItemsInFront<[File, number, string], [File, number]> = [string]\n * ```\n */\ntype RemoveItemsInFront<\n TItems extends any[],\n TItemsToRemove extends any[]\n> = TItems extends [...TItemsToRemove, ...infer TRest] ? TRest : TItems\n\nexport const partial = <T extends any[], TA extends Partial<T>, R>(\n fn: (...args: T) => R,\n ...args: TA\n) => {\n return (...rest: RemoveItemsInFront<T, TA>) =>\n fn(...([...args, ...rest] as T))\n}\n/**\n * Like partial but for unary functions that accept\n * a single object argument\n */\nexport const partob = <T, K, PartialArgs extends Partial<T>>(\n fn: (args: T) => K,\n argobj: PartialArgs\n) => {\n return (restobj: Omit<T, keyof PartialArgs>): K =>\n fn({\n ...(argobj as Partial<T>),\n ...(restobj as Partial<T>)\n } as T)\n}\n\n/**\n * Creates a Proxy object that will dynamically\n * call the handler argument when attributes are\n * accessed\n */\nexport const proxied = <T, K>(\n handler: (propertyName: T) => K\n): Record<string, K> => {\n return new Proxy(\n {},\n {\n get: (target, propertyName: any) => handler(propertyName)\n }\n )\n}\n\ntype Cache<T> = Record<string, { exp: number | null; value: T }>\n\nconst memoize = <TArgs extends any[], TResult>(\n cache: Cache<TResult>,\n func: (...args: TArgs) => TResult,\n keyFunc: ((...args: TArgs) => string) | null,\n ttl: number | null\n) => {\n return function callWithMemo(...args: any): TResult {\n const key = keyFunc ? keyFunc(...args) : JSON.stringify({ args })\n const existing = cache[key]\n if (existing !== undefined) {\n if (!existing.exp) return existing.value\n if (existing.exp > new Date().getTime()) {\n return existing.value\n }\n }\n const result = func(...args)\n cache[key] = {\n exp: ttl ? new Date().getTime() + ttl : null,\n value: result\n }\n return result\n }\n}\n\n/**\n * Creates a memoized function. The returned function\n * will only execute the source function when no value\n * has previously been computed. If a ttl (milliseconds)\n * is given previously computed values will be checked\n * for expiration before being returned.\n */\nexport const memo = <TArgs extends any[], TResult>(\n func: (...args: TArgs) => TResult,\n options: {\n key?: (...args: TArgs) => string\n ttl?: number\n } = {}\n) => {\n return memoize({}, func, options.key ?? null, options.ttl ?? null) as (\n ...args: TArgs\n ) => TResult\n}\n\nexport type DebounceFunction<TArgs extends any[]> = {\n (...args: TArgs): void\n /**\n * Cancels the debounced function\n */\n cancel(): void\n /**\n * Checks if there is any invocation debounced\n */\n isPending(): boolean\n /**\n * Runs the debounced function immediately\n */\n flush(...args: TArgs): void\n}\n\nexport type ThrottledFunction<TArgs extends any[]> = {\n (...args: TArgs): void\n /**\n * Checks if there is any invocation throttled\n */\n isThrottled(): boolean\n}\n\n/**\n * Given a delay and a function returns a new function\n * that will only call the source function after delay\n * milliseconds have passed without any invocations.\n *\n * The debounce function comes with a `cancel` method\n * to cancel delayed `func` invocations and a `flush`\n * method to invoke them immediately\n */\nexport const debounce = <TArgs extends any[]>(\n { delay }: { delay: number },\n func: (...args: TArgs) => any\n) => {\n let timer: unknown = undefined\n let active = true\n\n const debounced: DebounceFunction<TArgs> = (...args: TArgs) => {\n if (active) {\n clearTimeout(timer)\n timer = setTimeout(() => {\n active && func(...args)\n timer = undefined\n }, delay)\n } else {\n func(...args)\n }\n }\n debounced.isPending = () => {\n return timer !== undefined\n }\n debounced.cancel = () => {\n active = false\n }\n debounced.flush = (...args: TArgs) => func(...args)\n\n return debounced\n}\n\n/**\n * Given an interval and a function returns a new function\n * that will only call the source function if interval milliseconds\n * have passed since the last invocation\n */\nexport const throttle = <TArgs extends any[]>(\n { interval }: { interval: number },\n func: (...args: TArgs) => any\n) => {\n let ready = true\n let timer: unknown = undefined\n\n const throttled: ThrottledFunction<TArgs> = (...args: TArgs) => {\n if (!ready) return\n func(...args)\n ready = false\n timer = setTimeout(() => {\n ready = true\n timer = undefined\n }, interval)\n }\n throttled.isThrottled = () => {\n return timer !== undefined\n }\n return throttled\n}\n\n/**\n * Make an object callable. Given an object and a function\n * the returned object will be a function with all the\n * objects properties.\n *\n * @example\n * ```typescript\n * const car = callable({\n * wheels: 2\n * }, self => () => {\n * return 'driving'\n * })\n *\n * car.wheels // => 2\n * car() // => 'driving'\n * ```\n */\nexport const callable = <\n TValue,\n TObj extends Record<string | number | symbol, TValue>,\n TFunc extends (...args: any) => any\n>(\n obj: TObj,\n fn: (self: TObj) => TFunc\n): TObj & TFunc => {\n /* istanbul ignore next */\n const FUNC = () => {}\n return new Proxy(Object.assign(FUNC, obj), {\n get: (target, key: string) => target[key],\n set: (target, key: string, value: any) => {\n ;(target as any)[key] = value\n return true\n },\n apply: (target, self, args) => fn(Object.assign({}, target))(...args)\n }) as unknown as TObj & TFunc\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ 'use strict';
2
+
3
+ const array = require('./array.cjs');
4
+ const async = require('./async.cjs');
5
+ const curry = require('./curry.cjs');
6
+ const number = require('./number.cjs');
7
+ const object = require('./object.cjs');
8
+ const random = require('./random.cjs');
9
+ const series = require('./series.cjs');
10
+ const string = require('./string.cjs');
11
+ const typed = require('./typed.cjs');
12
+
13
+
14
+
15
+ exports.alphabetical = array.alphabetical;
16
+ exports.boil = array.boil;
17
+ exports.cluster = array.cluster;
18
+ exports.counting = array.counting;
19
+ exports.diff = array.diff;
20
+ exports.first = array.first;
21
+ exports.flat = array.flat;
22
+ exports.fork = array.fork;
23
+ exports.group = array.group;
24
+ exports.intersects = array.intersects;
25
+ exports.iterate = array.iterate;
26
+ exports.last = array.last;
27
+ exports.list = array.list;
28
+ exports.max = array.max;
29
+ exports.merge = array.merge;
30
+ exports.min = array.min;
31
+ exports.objectify = array.objectify;
32
+ exports.range = array.range;
33
+ exports.replace = array.replace;
34
+ exports.replaceOrAppend = array.replaceOrAppend;
35
+ exports.select = array.select;
36
+ exports.shift = array.shift;
37
+ exports.sift = array.sift;
38
+ exports.sort = array.sort;
39
+ exports.sum = array.sum;
40
+ exports.toggle = array.toggle;
41
+ exports.unique = array.unique;
42
+ exports.zip = array.zip;
43
+ exports.zipToObject = array.zipToObject;
44
+ exports.all = async.all;
45
+ exports.defer = async.defer;
46
+ exports.guard = async.guard;
47
+ exports.map = async.map;
48
+ exports.parallel = async.parallel;
49
+ exports.reduce = async.reduce;
50
+ exports.retry = async.retry;
51
+ exports.sleep = async.sleep;
52
+ exports.try = async.tryit;
53
+ exports.tryit = async.tryit;
54
+ exports.callable = curry.callable;
55
+ exports.chain = curry.chain;
56
+ exports.compose = curry.compose;
57
+ exports.debounce = curry.debounce;
58
+ exports.memo = curry.memo;
59
+ exports.partial = curry.partial;
60
+ exports.partob = curry.partob;
61
+ exports.proxied = curry.proxied;
62
+ exports.throttle = curry.throttle;
63
+ exports.inRange = number.inRange;
64
+ exports.toFloat = number.toFloat;
65
+ exports.toInt = number.toInt;
66
+ exports.assign = object.assign;
67
+ exports.clone = object.clone;
68
+ exports.construct = object.construct;
69
+ exports.crush = object.crush;
70
+ exports.get = object.get;
71
+ exports.invert = object.invert;
72
+ exports.keys = object.keys;
73
+ exports.listify = object.listify;
74
+ exports.lowerize = object.lowerize;
75
+ exports.mapEntries = object.mapEntries;
76
+ exports.mapKeys = object.mapKeys;
77
+ exports.mapValues = object.mapValues;
78
+ exports.omit = object.omit;
79
+ exports.pick = object.pick;
80
+ exports.set = object.set;
81
+ exports.shake = object.shake;
82
+ exports.upperize = object.upperize;
83
+ exports.draw = random.draw;
84
+ exports.random = random.random;
85
+ exports.shuffle = random.shuffle;
86
+ exports.uid = random.uid;
87
+ exports.series = series.series;
88
+ exports.camel = string.camel;
89
+ exports.capitalize = string.capitalize;
90
+ exports.dash = string.dash;
91
+ exports.pascal = string.pascal;
92
+ exports.snake = string.snake;
93
+ exports.template = string.template;
94
+ exports.title = string.title;
95
+ exports.trim = string.trim;
96
+ exports.isArray = typed.isArray;
97
+ exports.isDate = typed.isDate;
98
+ exports.isEmpty = typed.isEmpty;
99
+ exports.isEqual = typed.isEqual;
100
+ exports.isFloat = typed.isFloat;
101
+ exports.isFunction = typed.isFunction;
102
+ exports.isInt = typed.isInt;
103
+ exports.isNumber = typed.isNumber;
104
+ exports.isObject = typed.isObject;
105
+ exports.isPrimitive = typed.isPrimitive;
106
+ exports.isPromise = typed.isPromise;
107
+ exports.isString = typed.isString;
108
+ exports.isSymbol = typed.isSymbol;
109
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ function inRange(number, start, end) {
4
+ const isTypeSafe = typeof number === "number" && typeof start === "number" && (typeof end === "undefined" || typeof end === "number");
5
+ if (!isTypeSafe) {
6
+ return false;
7
+ }
8
+ if (typeof end === "undefined") {
9
+ end = start;
10
+ start = 0;
11
+ }
12
+ return number >= Math.min(start, end) && number < Math.max(start, end);
13
+ }
14
+ const toFloat = (value, defaultValue) => {
15
+ const def = defaultValue === void 0 ? 0 : defaultValue;
16
+ if (value === null || value === void 0) {
17
+ return def;
18
+ }
19
+ const result = parseFloat(value);
20
+ return isNaN(result) ? def : result;
21
+ };
22
+ const toInt = (value, defaultValue) => {
23
+ const def = defaultValue === void 0 ? 0 : defaultValue;
24
+ if (value === null || value === void 0) {
25
+ return def;
26
+ }
27
+ const result = parseInt(value);
28
+ return isNaN(result) ? def : result;
29
+ };
30
+
31
+ exports.inRange = inRange;
32
+ exports.toFloat = toFloat;
33
+ exports.toInt = toInt;
34
+ //# sourceMappingURL=number.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.cjs","sources":["../../src/number.ts"],"sourcesContent":["/**\n * Checks if the given number is between zero (0) and the ending number. 0 is inclusive.\n *\n * * Numbers can be negative or positive.\n * * Ending number is exclusive.\n *\n * @param {number} number The number to check.\n * @param {number} end The end of the range. Exclusive.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\nexport function inRange(number: number, end: number): boolean\n\n/**\n * Checks if the given number is between two numbers.\n *\n * * Numbers can be negative or positive.\n * * Starting number is inclusive.\n * * Ending number is exclusive.\n * * The start and the end of the range can be ascending OR descending order.\n *\n * @param {number} number The number to check.\n * @param {number} start The start of the range. Inclusive.\n * @param {number} end The end of the range. Exclusive.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\nexport function inRange(number: number, start: number, end: number): boolean\nexport function inRange(number: number, start: number, end?: number): boolean {\n const isTypeSafe =\n typeof number === 'number' &&\n typeof start === 'number' &&\n (typeof end === 'undefined' || typeof end === 'number')\n\n if (!isTypeSafe) {\n return false\n }\n\n if (typeof end === 'undefined') {\n end = start\n start = 0\n }\n\n return number >= Math.min(start, end) && number < Math.max(start, end)\n}\n\nexport const toFloat = <T extends number | null = number>(\n value: any,\n defaultValue?: T\n): number | T => {\n const def = defaultValue === undefined ? 0.0 : defaultValue\n if (value === null || value === undefined) {\n return def\n }\n const result = parseFloat(value)\n return isNaN(result) ? def : result\n}\n\nexport const toInt = <T extends number | null = number>(\n value: any,\n defaultValue?: T\n): number | T => {\n const def = defaultValue === undefined ? 0 : defaultValue\n if (value === null || value === undefined) {\n return def\n }\n const result = parseInt(value)\n return isNaN(result) ? def : result\n}\n"],"names":[],"mappings":";;AA0BgB,SAAA,OAAA,CAAQ,MAAgB,EAAA,KAAA,EAAe,GAAuB,EAAA;AAC5E,EAAM,MAAA,UAAA,GACJ,OAAO,MAAA,KAAW,QAClB,IAAA,OAAO,KAAU,KAAA,QAAA,KAChB,OAAO,GAAA,KAAQ,WAAe,IAAA,OAAO,GAAQ,KAAA,QAAA,CAAA,CAAA;AAEhD,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA,OAAO,QAAQ,WAAa,EAAA;AAC9B,IAAM,GAAA,GAAA,KAAA,CAAA;AACN,IAAQ,KAAA,GAAA,CAAA,CAAA;AAAA,GACV;AAEA,EAAO,OAAA,MAAA,IAAU,IAAK,CAAA,GAAA,CAAI,KAAO,EAAA,GAAG,KAAK,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,KAAA,EAAO,GAAG,CAAA,CAAA;AACvE,CAAA;AAEa,MAAA,OAAA,GAAU,CACrB,KAAA,EACA,YACe,KAAA;AACf,EAAM,MAAA,GAAA,GAAM,YAAiB,KAAA,KAAA,CAAA,GAAY,CAAM,GAAA,YAAA,CAAA;AAC/C,EAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AACzC,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,MAAA,GAAS,WAAW,KAAK,CAAA,CAAA;AAC/B,EAAO,OAAA,KAAA,CAAM,MAAM,CAAA,GAAI,GAAM,GAAA,MAAA,CAAA;AAC/B,EAAA;AAEa,MAAA,KAAA,GAAQ,CACnB,KAAA,EACA,YACe,KAAA;AACf,EAAM,MAAA,GAAA,GAAM,YAAiB,KAAA,KAAA,CAAA,GAAY,CAAI,GAAA,YAAA,CAAA;AAC7C,EAAI,IAAA,KAAA,KAAU,IAAQ,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AACzC,IAAO,OAAA,GAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,MAAA,GAAS,SAAS,KAAK,CAAA,CAAA;AAC7B,EAAO,OAAA,KAAA,CAAM,MAAM,CAAA,GAAI,GAAM,GAAA,MAAA,CAAA;AAC/B;;;;;;"}
@@ -0,0 +1,204 @@
1
+ 'use strict';
2
+
3
+ const array = require('./array.cjs');
4
+ const number = require('./number.cjs');
5
+ const typed = require('./typed.cjs');
6
+
7
+ const shake = (obj, filter = (x) => x === void 0) => {
8
+ if (!obj)
9
+ return {};
10
+ const keys2 = Object.keys(obj);
11
+ return keys2.reduce((acc, key) => {
12
+ if (filter(obj[key])) {
13
+ return acc;
14
+ } else {
15
+ acc[key] = obj[key];
16
+ return acc;
17
+ }
18
+ }, {});
19
+ };
20
+ const mapKeys = (obj, mapFunc) => {
21
+ const keys2 = Object.keys(obj);
22
+ return keys2.reduce((acc, key) => {
23
+ acc[mapFunc(key, obj[key])] = obj[key];
24
+ return acc;
25
+ }, {});
26
+ };
27
+ const mapValues = (obj, mapFunc) => {
28
+ const keys2 = Object.keys(obj);
29
+ return keys2.reduce((acc, key) => {
30
+ acc[key] = mapFunc(obj[key], key);
31
+ return acc;
32
+ }, {});
33
+ };
34
+ const mapEntries = (obj, toEntry) => {
35
+ if (!obj)
36
+ return {};
37
+ return Object.entries(obj).reduce((acc, [key, value]) => {
38
+ const [newKey, newValue] = toEntry(key, value);
39
+ acc[newKey] = newValue;
40
+ return acc;
41
+ }, {});
42
+ };
43
+ const invert = (obj) => {
44
+ if (!obj)
45
+ return {};
46
+ const keys2 = Object.keys(obj);
47
+ return keys2.reduce((acc, key) => {
48
+ acc[obj[key]] = key;
49
+ return acc;
50
+ }, {});
51
+ };
52
+ const lowerize = (obj) => mapKeys(obj, (k) => k.toLowerCase());
53
+ const upperize = (obj) => mapKeys(obj, (k) => k.toUpperCase());
54
+ const clone = (obj) => {
55
+ if (typed.isPrimitive(obj)) {
56
+ return obj;
57
+ }
58
+ if (typeof obj === "function") {
59
+ return obj.bind({});
60
+ }
61
+ const newObj = new obj.constructor();
62
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
63
+ newObj[prop] = obj[prop];
64
+ });
65
+ return newObj;
66
+ };
67
+ const listify = (obj, toItem) => {
68
+ if (!obj)
69
+ return [];
70
+ const entries = Object.entries(obj);
71
+ if (entries.length === 0)
72
+ return [];
73
+ return entries.reduce((acc, entry) => {
74
+ acc.push(toItem(entry[0], entry[1]));
75
+ return acc;
76
+ }, []);
77
+ };
78
+ const pick = (obj, keys2) => {
79
+ if (!obj)
80
+ return {};
81
+ return keys2.reduce((acc, key) => {
82
+ if (Object.prototype.hasOwnProperty.call(obj, key))
83
+ acc[key] = obj[key];
84
+ return acc;
85
+ }, {});
86
+ };
87
+ const omit = (obj, keys2) => {
88
+ if (!obj)
89
+ return {};
90
+ if (!keys2 || keys2.length === 0)
91
+ return obj;
92
+ return keys2.reduce(
93
+ (acc, key) => {
94
+ delete acc[key];
95
+ return acc;
96
+ },
97
+ { ...obj }
98
+ );
99
+ };
100
+ const get = (value, path, defaultValue) => {
101
+ const segments = path.split(/[\.\[\]]/g);
102
+ let current = value;
103
+ for (const key of segments) {
104
+ if (current === null)
105
+ return defaultValue;
106
+ if (current === void 0)
107
+ return defaultValue;
108
+ const dequoted = key.replace(/['"]/g, "");
109
+ if (dequoted.trim() === "")
110
+ continue;
111
+ current = current[dequoted];
112
+ }
113
+ if (current === void 0)
114
+ return defaultValue;
115
+ return current;
116
+ };
117
+ const set = (initial, path, value) => {
118
+ if (!initial)
119
+ return {};
120
+ if (!path || value === void 0)
121
+ return initial;
122
+ const segments = path.split(/[\.\[\]]/g).filter((x) => !!x.trim());
123
+ const _set = (node) => {
124
+ if (segments.length > 1) {
125
+ const key = segments.shift();
126
+ const nextIsNum = number.toInt(segments[0], null) === null ? false : true;
127
+ node[key] = node[key] === void 0 ? nextIsNum ? [] : {} : node[key];
128
+ _set(node[key]);
129
+ } else {
130
+ node[segments[0]] = value;
131
+ }
132
+ };
133
+ const cloned = clone(initial);
134
+ _set(cloned);
135
+ return cloned;
136
+ };
137
+ const assign = (initial, override) => {
138
+ if (!initial || !override)
139
+ return initial ?? override ?? {};
140
+ return Object.entries({ ...initial, ...override }).reduce(
141
+ (acc, [key, value]) => {
142
+ return {
143
+ ...acc,
144
+ [key]: (() => {
145
+ if (typed.isObject(initial[key]))
146
+ return assign(initial[key], value);
147
+ return value;
148
+ })()
149
+ };
150
+ },
151
+ {}
152
+ );
153
+ };
154
+ const keys = (value) => {
155
+ if (!value)
156
+ return [];
157
+ const getKeys = (nested, paths) => {
158
+ if (typed.isObject(nested)) {
159
+ return Object.entries(nested).flatMap(
160
+ ([k, v]) => getKeys(v, [...paths, k])
161
+ );
162
+ }
163
+ if (typed.isArray(nested)) {
164
+ return nested.flatMap((item, i) => getKeys(item, [...paths, `${i}`]));
165
+ }
166
+ return [paths.join(".")];
167
+ };
168
+ return getKeys(value, []);
169
+ };
170
+ const crush = (value) => {
171
+ if (!value)
172
+ return {};
173
+ return array.objectify(
174
+ keys(value),
175
+ (k) => k,
176
+ (k) => get(value, k)
177
+ );
178
+ };
179
+ const construct = (obj) => {
180
+ if (!obj)
181
+ return {};
182
+ return Object.keys(obj).reduce((acc, path) => {
183
+ return set(acc, path, obj[path]);
184
+ }, {});
185
+ };
186
+
187
+ exports.assign = assign;
188
+ exports.clone = clone;
189
+ exports.construct = construct;
190
+ exports.crush = crush;
191
+ exports.get = get;
192
+ exports.invert = invert;
193
+ exports.keys = keys;
194
+ exports.listify = listify;
195
+ exports.lowerize = lowerize;
196
+ exports.mapEntries = mapEntries;
197
+ exports.mapKeys = mapKeys;
198
+ exports.mapValues = mapValues;
199
+ exports.omit = omit;
200
+ exports.pick = pick;
201
+ exports.set = set;
202
+ exports.shake = shake;
203
+ exports.upperize = upperize;
204
+ //# sourceMappingURL=object.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.cjs","sources":["../../src/object.ts"],"sourcesContent":["import { objectify } from './array'\nimport { toInt } from './number'\nimport { isArray, isObject, isPrimitive } from './typed'\n\ntype LowercasedKeys<T extends Record<string, any>> = {\n [P in keyof T & string as Lowercase<P>]: T[P]\n}\n\ntype UppercasedKeys<T extends Record<string, any>> = {\n [P in keyof T & string as Uppercase<P>]: T[P]\n}\n\n/**\n * Removes (shakes out) undefined entries from an\n * object. Optional second argument shakes out values\n * by custom evaluation.\n */\nexport const shake = <RemovedKeys extends string, T>(\n obj: T,\n filter: (value: any) => boolean = x => x === undefined\n): Omit<T, RemovedKeys> => {\n if (!obj) return {} as T\n const keys = Object.keys(obj) as (keyof T)[]\n return keys.reduce((acc, key) => {\n if (filter(obj[key])) {\n return acc\n } else {\n acc[key] = obj[key]\n return acc\n }\n }, {} as T)\n}\n\n/**\n * Map over all the keys of an object to return\n * a new object\n */\nexport const mapKeys = <\n TValue,\n TKey extends string | number | symbol,\n TNewKey extends string | number | symbol\n>(\n obj: Record<TKey, TValue>,\n mapFunc: (key: TKey, value: TValue) => TNewKey\n): Record<TNewKey, TValue> => {\n const keys = Object.keys(obj) as TKey[]\n return keys.reduce((acc, key) => {\n acc[mapFunc(key as TKey, obj[key])] = obj[key]\n return acc\n }, {} as Record<TNewKey, TValue>)\n}\n\n/**\n * Map over all the keys to create a new object\n */\nexport const mapValues = <\n TValue,\n TKey extends string | number | symbol,\n TNewValue\n>(\n obj: Record<TKey, TValue>,\n mapFunc: (value: TValue, key: TKey) => TNewValue\n): Record<TKey, TNewValue> => {\n const keys = Object.keys(obj) as TKey[]\n return keys.reduce((acc, key) => {\n acc[key] = mapFunc(obj[key], key)\n return acc\n }, {} as Record<TKey, TNewValue>)\n}\n\n/**\n * Map over all the keys to create a new object\n */\nexport const mapEntries = <\n TKey extends string | number | symbol,\n TValue,\n TNewKey extends string | number | symbol,\n TNewValue\n>(\n obj: Record<TKey, TValue>,\n toEntry: (key: TKey, value: TValue) => [TNewKey, TNewValue]\n): Record<TNewKey, TNewValue> => {\n if (!obj) return {} as Record<TNewKey, TNewValue>\n return Object.entries(obj).reduce((acc, [key, value]) => {\n const [newKey, newValue] = toEntry(key as TKey, value as TValue)\n acc[newKey] = newValue\n return acc\n }, {} as Record<TNewKey, TNewValue>)\n}\n\n/**\n * Returns an object with { [keys]: value }\n * inverted as { [value]: key }\n */\nexport const invert = <\n TKey extends string | number | symbol,\n TValue extends string | number | symbol\n>(\n obj: Record<TKey, TValue>\n): Record<TValue, TKey> => {\n if (!obj) return {} as Record<TValue, TKey>\n const keys = Object.keys(obj) as TKey[]\n return keys.reduce((acc, key) => {\n acc[obj[key]] = key\n return acc\n }, {} as Record<TValue, TKey>)\n}\n\n/**\n * Convert all keys in an object to lower case\n */\nexport const lowerize = <T extends Record<string, any>>(obj: T) =>\n mapKeys(obj, k => k.toLowerCase()) as LowercasedKeys<T>\n\n/**\n * Convert all keys in an object to upper case\n */\nexport const upperize = <T extends Record<string, any>>(obj: T) =>\n mapKeys(obj, k => k.toUpperCase()) as UppercasedKeys<T>\n\n/**\n * Creates a shallow copy of the given obejct/value.\n * @param {*} obj value to clone\n * @returns {*} shallow clone of the given value\n */\nexport const clone = <T>(obj: T): T => {\n // Primitive values do not need cloning.\n if (isPrimitive(obj)) {\n return obj\n }\n\n // Binding a function to an empty object creates a\n // copy function.\n if (typeof obj === 'function') {\n return obj.bind({})\n }\n\n // Access the constructor and create a new object.\n // This method can create an array as well.\n const newObj = new ((obj as object).constructor as { new (): T })()\n\n // Assign the props.\n Object.getOwnPropertyNames(obj).forEach(prop => {\n // Bypass type checking since the primitive cases\n // are already checked in the beginning\n ;(newObj as any)[prop] = (obj as any)[prop]\n })\n\n return newObj\n}\n\n/**\n * Convert an object to a list, mapping each entry\n * into a list item\n */\nexport const listify = <TValue, TKey extends string | number | symbol, KResult>(\n obj: Record<TKey, TValue>,\n toItem: (key: TKey, value: TValue) => KResult\n) => {\n if (!obj) return []\n const entries = Object.entries(obj)\n if (entries.length === 0) return []\n return entries.reduce((acc, entry) => {\n acc.push(toItem(entry[0] as TKey, entry[1] as TValue))\n return acc\n }, [] as KResult[])\n}\n\n/**\n * Pick a list of properties from an object\n * into a new object\n */\nexport const pick = <T extends object, TKeys extends keyof T>(\n obj: T,\n keys: TKeys[]\n): Pick<T, TKeys> => {\n if (!obj) return {} as Pick<T, TKeys>\n return keys.reduce((acc, key) => {\n if (Object.prototype.hasOwnProperty.call(obj, key)) acc[key] = obj[key]\n return acc\n }, {} as Pick<T, TKeys>)\n}\n\n/**\n * Omit a list of properties from an object\n * returning a new object with the properties\n * that remain\n */\nexport const omit = <T, TKeys extends keyof T>(\n obj: T,\n keys: TKeys[]\n): Omit<T, TKeys> => {\n if (!obj) return {} as Omit<T, TKeys>\n if (!keys || keys.length === 0) return obj as Omit<T, TKeys>\n return keys.reduce(\n (acc, key) => {\n // Gross, I know, it's mutating the object, but we\n // are allowing it in this very limited scope due\n // to the performance implications of an omit func.\n // Not a pattern or practice to use elsewhere.\n delete acc[key]\n return acc\n },\n { ...obj }\n )\n}\n\n/**\n * Dynamically get a nested value from an array or\n * object with a string.\n *\n * @example get(person, 'friends[0].name')\n */\nexport const get = <TDefault = unknown>(\n value: any,\n path: string,\n defaultValue?: TDefault\n): TDefault => {\n const segments = path.split(/[\\.\\[\\]]/g)\n let current: any = value\n for (const key of segments) {\n if (current === null) return defaultValue as TDefault\n if (current === undefined) return defaultValue as TDefault\n const dequoted = key.replace(/['\"]/g, '')\n if (dequoted.trim() === '') continue\n current = current[dequoted]\n }\n if (current === undefined) return defaultValue as TDefault\n return current\n}\n\n/**\n * Opposite of get, dynamically set a nested value into\n * an object using a key path. Does not modify the given\n * initial object.\n *\n * @example\n * set({}, 'name', 'ra') // => { name: 'ra' }\n * set({}, 'cards[0].value', 2) // => { cards: [{ value: 2 }] }\n */\nexport const set = <T extends object, K>(\n initial: T,\n path: string,\n value: K\n): T => {\n if (!initial) return {} as T\n if (!path || value === undefined) return initial\n const segments = path.split(/[\\.\\[\\]]/g).filter(x => !!x.trim())\n const _set = (node: any) => {\n if (segments.length > 1) {\n const key = segments.shift() as string\n const nextIsNum = toInt(segments[0], null) === null ? false : true\n node[key] = node[key] === undefined ? (nextIsNum ? [] : {}) : node[key]\n _set(node[key])\n } else {\n node[segments[0]] = value\n }\n }\n // NOTE: One day, when structuredClone has more\n // compatability use it to clone the value\n // https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n const cloned = clone(initial)\n _set(cloned)\n return cloned\n}\n\n/**\n * Merges two objects together recursivly into a new\n * object applying values from right to left.\n * Recursion only applies to child object properties.\n */\nexport const assign = <X extends Record<string | symbol | number, any>>(\n initial: X,\n override: X\n): X => {\n if (!initial || !override) return initial ?? override ?? {}\n\n return Object.entries({ ...initial, ...override }).reduce(\n (acc, [key, value]) => {\n return {\n ...acc,\n [key]: (() => {\n if (isObject(initial[key])) return assign(initial[key], value)\n // if (isArray(value)) return value.map(x => assign)\n return value\n })()\n }\n },\n {} as X\n )\n}\n\n/**\n * Get a string list of all key names that exist in\n * an object (deep).\n *\n * @example\n * keys({ name: 'ra' }) // ['name']\n * keys({ name: 'ra', children: [{ name: 'hathor' }] }) // ['name', 'children.0.name']\n */\nexport const keys = <TValue extends object>(value: TValue): string[] => {\n if (!value) return []\n const getKeys = (nested: any, paths: string[]): string[] => {\n if (isObject(nested)) {\n return Object.entries(nested).flatMap(([k, v]) =>\n getKeys(v, [...paths, k])\n )\n }\n if (isArray(nested)) {\n return nested.flatMap((item, i) => getKeys(item, [...paths, `${i}`]))\n }\n return [paths.join('.')]\n }\n return getKeys(value, [])\n}\n\n/**\n * Flattens a deep object to a single demension, converting\n * the keys to dot notation.\n *\n * @example\n * crush({ name: 'ra', children: [{ name: 'hathor' }] })\n * // { name: 'ra', 'children.0.name': 'hathor' }\n */\nexport const crush = <TValue extends object>(value: TValue): object => {\n if (!value) return {}\n return objectify(\n keys(value),\n k => k,\n k => get(value, k)\n )\n}\n\n/**\n * The opposite of crush, given an object that was\n * crushed into key paths and values will return\n * the original object reconstructed.\n *\n * @example\n * construct({ name: 'ra', 'children.0.name': 'hathor' })\n * // { name: 'ra', children: [{ name: 'hathor' }] }\n */\nexport const construct = <TObject extends object>(obj: TObject): object => {\n if (!obj) return {}\n return Object.keys(obj).reduce((acc, path) => {\n return set(acc, path, (obj as any)[path])\n }, {})\n}\n"],"names":["keys","isPrimitive","toInt","isObject","isArray","objectify"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ const array = require('./array.cjs');
4
+
5
+ const random = (min, max) => {
6
+ return Math.floor(Math.random() * (max - min + 1) + min);
7
+ };
8
+ const draw = (array) => {
9
+ const max = array.length;
10
+ if (max === 0) {
11
+ return null;
12
+ }
13
+ const index = random(0, max - 1);
14
+ return array[index];
15
+ };
16
+ const shuffle = (array) => {
17
+ return array.map((a) => ({ rand: Math.random(), value: a })).sort((a, b) => a.rand - b.rand).map((a) => a.value);
18
+ };
19
+ const uid = (length, specials = "") => {
20
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + specials;
21
+ return array.iterate(
22
+ length,
23
+ (acc) => {
24
+ return acc + characters.charAt(random(0, characters.length - 1));
25
+ },
26
+ ""
27
+ );
28
+ };
29
+
30
+ exports.draw = draw;
31
+ exports.random = random;
32
+ exports.shuffle = shuffle;
33
+ exports.uid = uid;
34
+ //# sourceMappingURL=random.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.cjs","sources":["../../src/random.ts"],"sourcesContent":["import { iterate } from './array'\n\n/**\n * Generates a random number between min and max\n */\nexport const random = (min: number, max: number) => {\n return Math.floor(Math.random() * (max - min + 1) + min)\n}\n\n/**\n * Draw a random item from a list. Returns\n * null if the list is empty\n */\nexport const draw = <T>(array: readonly T[]): T | null => {\n const max = array.length\n if (max === 0) {\n return null\n }\n const index = random(0, max - 1)\n return array[index]\n}\n\nexport const shuffle = <T>(array: readonly T[]): T[] => {\n return array\n .map(a => ({ rand: Math.random(), value: a }))\n .sort((a, b) => a.rand - b.rand)\n .map(a => a.value)\n}\n\nexport const uid = (length: number, specials: string = '') => {\n const characters =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + specials\n return iterate(\n length,\n acc => {\n return acc + characters.charAt(random(0, characters.length - 1))\n },\n ''\n )\n}\n"],"names":["iterate"],"mappings":";;;;AAKa,MAAA,MAAA,GAAS,CAAC,GAAA,EAAa,GAAgB,KAAA;AAClD,EAAO,OAAA,IAAA,CAAK,MAAM,IAAK,CAAA,MAAA,MAAY,GAAM,GAAA,GAAA,GAAM,KAAK,GAAG,CAAA,CAAA;AACzD,EAAA;AAMa,MAAA,IAAA,GAAO,CAAI,KAAkC,KAAA;AACxD,EAAA,MAAM,MAAM,KAAM,CAAA,MAAA,CAAA;AAClB,EAAA,IAAI,QAAQ,CAAG,EAAA;AACb,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,CAAG,EAAA,GAAA,GAAM,CAAC,CAAA,CAAA;AAC/B,EAAA,OAAO,MAAM,KAAK,CAAA,CAAA;AACpB,EAAA;AAEa,MAAA,OAAA,GAAU,CAAI,KAA6B,KAAA;AACtD,EAAO,OAAA,KAAA,CACJ,GAAI,CAAA,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,KAAK,MAAO,EAAA,EAAG,KAAO,EAAA,CAAA,EAAI,CAAA,CAAA,CAC5C,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,IAAO,GAAA,CAAA,CAAE,IAAI,CAC9B,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,KAAK,CAAA,CAAA;AACrB,EAAA;AAEO,MAAM,GAAM,GAAA,CAAC,MAAgB,EAAA,QAAA,GAAmB,EAAO,KAAA;AAC5D,EAAA,MAAM,aACJ,gEAAmE,GAAA,QAAA,CAAA;AACrE,EAAO,OAAAA,aAAA;AAAA,IACL,MAAA;AAAA,IACA,CAAO,GAAA,KAAA;AACL,MAAO,OAAA,GAAA,GAAM,WAAW,MAAO,CAAA,MAAA,CAAO,GAAG,UAAW,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAAA,KACjE;AAAA,IACA,EAAA;AAAA,GACF,CAAA;AACF;;;;;;;"}
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ const array = require('./array.cjs');
4
+
5
+ const series = (items, toKey = (item) => `${item}`) => {
6
+ const { indexesByKey, itemsByIndex } = items.reduce(
7
+ (acc, item, idx) => ({
8
+ indexesByKey: {
9
+ ...acc.indexesByKey,
10
+ [toKey(item)]: idx
11
+ },
12
+ itemsByIndex: {
13
+ ...acc.itemsByIndex,
14
+ [idx]: item
15
+ }
16
+ }),
17
+ {
18
+ indexesByKey: {},
19
+ itemsByIndex: {}
20
+ }
21
+ );
22
+ const min = (a, b) => {
23
+ return indexesByKey[toKey(a)] < indexesByKey[toKey(b)] ? a : b;
24
+ };
25
+ const max = (a, b) => {
26
+ return indexesByKey[toKey(a)] > indexesByKey[toKey(b)] ? a : b;
27
+ };
28
+ const first = () => {
29
+ return itemsByIndex[0];
30
+ };
31
+ const last = () => {
32
+ return itemsByIndex[items.length - 1];
33
+ };
34
+ const next = (current, defaultValue) => {
35
+ return itemsByIndex[indexesByKey[toKey(current)] + 1] ?? defaultValue ?? first();
36
+ };
37
+ const previous = (current, defaultValue) => {
38
+ return itemsByIndex[indexesByKey[toKey(current)] - 1] ?? defaultValue ?? last();
39
+ };
40
+ const spin = (current, num) => {
41
+ if (num === 0)
42
+ return current;
43
+ const abs = Math.abs(num);
44
+ const rel = abs > items.length ? abs % items.length : abs;
45
+ return array.list(0, rel - 1).reduce(
46
+ (acc) => num > 0 ? next(acc) : previous(acc),
47
+ current
48
+ );
49
+ };
50
+ return {
51
+ min,
52
+ max,
53
+ first,
54
+ last,
55
+ next,
56
+ previous,
57
+ spin
58
+ };
59
+ };
60
+
61
+ exports.series = series;
62
+ //# sourceMappingURL=series.cjs.map