lil-fp
Advanced tools
Comparing version 1.1.9 to 1.2.0
export { a as Arr } from './arr-baeb89ce.js'; | ||
export { b as Bool } from './bool-38e9ed29.js'; | ||
export { done, flow, log, memo, pipe, tap } from './func.js'; | ||
export { o as Obj } from './obj-cd6ce7e4.js'; | ||
export { o as Obj } from './obj-164f8b14.js'; | ||
export { isArr, isBool, isFunc, isNum, isObj, isStr } from './is.js'; | ||
@@ -6,0 +6,0 @@ export { alt, match, otherwise, when } from './logic.js'; |
@@ -105,2 +105,3 @@ "use strict"; | ||
compact: () => compact2, | ||
defaults: () => defaults, | ||
entries: () => entries, | ||
@@ -110,2 +111,3 @@ filter: () => filter2, | ||
fromEntries: () => fromEntries, | ||
get: () => get, | ||
keys: () => keys, | ||
@@ -168,3 +170,11 @@ map: () => map2, | ||
[key]: fn(obj[key]) | ||
}); | ||
}), defaults = (defaults2) => (obj) => cast({ | ||
...defaults2, | ||
...obj | ||
}), get = (key, fallback) => (obj) => { | ||
let keys2 = key.split("."), i = 0; | ||
for (; obj[keys2[i]]; ) | ||
obj = obj[keys2[i]], i++; | ||
return obj ?? fallback; | ||
}; | ||
@@ -171,0 +181,0 @@ // src/logic.ts |
import './types.js'; | ||
export { b as assign, c as assignTo, n as bind, l as cast, h as clone, g as compact, e as entries, d as filter, a as from, f as fromEntries, k as keys, m as map, i as merge, j as omit, p as pick, s as split } from './obj-cd6ce7e4.js'; | ||
export { b as assign, c as assignTo, n as bind, l as cast, h as clone, g as compact, q as defaults, e as entries, d as filter, a as from, f as fromEntries, r as get, k as keys, m as map, i as merge, j as omit, p as pick, s as split } from './obj-164f8b14.js'; |
@@ -26,2 +26,3 @@ "use strict"; | ||
compact: () => compact, | ||
defaults: () => defaults, | ||
entries: () => entries, | ||
@@ -31,2 +32,3 @@ filter: () => filter, | ||
fromEntries: () => fromEntries, | ||
get: () => get, | ||
keys: () => keys, | ||
@@ -90,3 +92,11 @@ map: () => map, | ||
[key]: fn(obj[key]) | ||
}); | ||
}), defaults = (defaults2) => (obj) => cast({ | ||
...defaults2, | ||
...obj | ||
}), get = (key, fallback) => (obj) => { | ||
let keys2 = key.split("."), i = 0; | ||
for (; obj[keys2[i]]; ) | ||
obj = obj[keys2[i]], i++; | ||
return obj ?? fallback; | ||
}; | ||
// Annotate the CommonJS export names for ESM import in node: | ||
@@ -100,2 +110,3 @@ 0 && (module.exports = { | ||
compact, | ||
defaults, | ||
entries, | ||
@@ -105,2 +116,3 @@ filter, | ||
fromEntries, | ||
get, | ||
keys, | ||
@@ -107,0 +119,0 @@ map, |
@@ -22,3 +22,20 @@ type Dict = Record<string, any>; | ||
] ? Simplify<Assign<Rest, Merge<Target, Next>>> : T extends [...infer Rest, infer Next] ? Simplify<Merge<Assign<Rest, Target>, Next>> : T extends [] ? Simplify<Target> : T extends (infer I)[] ? Simplify<Merge<Target, I>> : Simplify<Target>; | ||
type Primitive = null | undefined | string | number | boolean | symbol | bigint; | ||
type ArrayKey = number; | ||
type IsTuple<T extends readonly any[]> = number extends T['length'] ? false : true; | ||
type TupleKeys<T extends readonly any[]> = Exclude<keyof T, keyof any[]>; | ||
type PathConcat<TKey extends string | number, TValue> = TValue extends Primitive ? `${TKey}` : `${TKey}` | `${TKey}.${Path<TValue>}`; | ||
type Path<T> = T extends readonly (infer V)[] ? IsTuple<T> extends true ? { | ||
[K in TupleKeys<T>]-?: PathConcat<K & string, T[K]>; | ||
}[TupleKeys<T>] : PathConcat<ArrayKey, V> : { | ||
[K in keyof T]-?: PathConcat<K & string, T[K]>; | ||
}[keyof T]; | ||
type ArrayPathConcat<TKey extends string | number, TValue> = TValue extends Primitive ? never : TValue extends readonly (infer U)[] ? U extends Primitive ? never : `${TKey}` | `${TKey}.${ArrayPath<TValue>}` : `${TKey}.${ArrayPath<TValue>}`; | ||
type ArrayPath<T> = T extends readonly (infer V)[] ? IsTuple<T> extends true ? { | ||
[K in TupleKeys<T>]-?: ArrayPathConcat<K & string, T[K]>; | ||
}[TupleKeys<T>] : ArrayPathConcat<ArrayKey, V> : { | ||
[K in keyof T]-?: ArrayPathConcat<K & string, T[K]>; | ||
}[keyof T]; | ||
type PathValue<T, TPath extends Path<T> | ArrayPath<T>> = T extends any ? TPath extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path<T[K]> ? PathValue<T[K], R> : never : K extends `${ArrayKey}` ? T extends readonly (infer V)[] ? PathValue<V, R & Path<V>> : never : never : TPath extends keyof T ? T[TPath] : TPath extends `${ArrayKey}` ? T extends readonly (infer V)[] ? V : never : never : never; | ||
export { Assign, Awaited, Compact, Dict, PromiseFactory, Simplify, Split, SplitProp }; | ||
export { ArrayPath, Assign, Awaited, Compact, Dict, Path, PathConcat, PathValue, Primitive, PromiseFactory, Simplify, Split, SplitProp }; |
{ | ||
"name": "lil-fp", | ||
"version": "1.1.9", | ||
"version": "1.2.0", | ||
"description": "Functional programming utilities for TypeScript", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
import { isFunc, isObj } from './is' | ||
import { Compact, Dict, Assign, Split, SplitProp, Simplify } from './types' | ||
import { | ||
Assign, | ||
Compact, | ||
Dict, | ||
Path, | ||
Simplify, | ||
Split, | ||
SplitProp, | ||
} from './types' | ||
@@ -136,1 +144,25 @@ export const fromEntries = <T extends Dict>( | ||
}) | ||
type Defaults<T extends Dict, K extends Partial<T>> = Simplify< | ||
Omit<T, keyof K> & Required<K> | ||
> | ||
export const defaults = | ||
<T extends Dict, K extends Partial<T>>(defaults: K) => | ||
(obj: T): Defaults<T, K> => | ||
cast({ | ||
...defaults, | ||
...obj, | ||
}) | ||
export const get = | ||
<T extends Dict, K extends Path<T>, V>(key: K, fallback?: V) => | ||
(obj: T): T[K] | V => { | ||
let keys = key.split('.') | ||
let i = 0 | ||
while (obj[keys[i]]) { | ||
obj = obj[keys[i]] | ||
i++ | ||
} | ||
return (obj ?? fallback) as any | ||
} |
@@ -42,1 +42,74 @@ export type Dict = Record<string, any> | ||
: Simplify<Target> | ||
export type Primitive = | ||
| null | ||
| undefined | ||
| string | ||
| number | ||
| boolean | ||
| symbol | ||
| bigint | ||
type ArrayKey = number | ||
type IsTuple<T extends readonly any[]> = number extends T['length'] | ||
? false | ||
: true | ||
type TupleKeys<T extends readonly any[]> = Exclude<keyof T, keyof any[]> | ||
export type PathConcat< | ||
TKey extends string | number, | ||
TValue | ||
> = TValue extends Primitive ? `${TKey}` : `${TKey}` | `${TKey}.${Path<TValue>}` | ||
export type Path<T> = T extends readonly (infer V)[] | ||
? IsTuple<T> extends true | ||
? { | ||
[K in TupleKeys<T>]-?: PathConcat<K & string, T[K]> | ||
}[TupleKeys<T>] | ||
: PathConcat<ArrayKey, V> | ||
: { | ||
[K in keyof T]-?: PathConcat<K & string, T[K]> | ||
}[keyof T] | ||
type ArrayPathConcat< | ||
TKey extends string | number, | ||
TValue | ||
> = TValue extends Primitive | ||
? never | ||
: TValue extends readonly (infer U)[] | ||
? U extends Primitive | ||
? never | ||
: `${TKey}` | `${TKey}.${ArrayPath<TValue>}` | ||
: `${TKey}.${ArrayPath<TValue>}` | ||
export type ArrayPath<T> = T extends readonly (infer V)[] | ||
? IsTuple<T> extends true | ||
? { | ||
[K in TupleKeys<T>]-?: ArrayPathConcat<K & string, T[K]> | ||
}[TupleKeys<T>] | ||
: ArrayPathConcat<ArrayKey, V> | ||
: { | ||
[K in keyof T]-?: ArrayPathConcat<K & string, T[K]> | ||
}[keyof T] | ||
export type PathValue<T, TPath extends Path<T> | ArrayPath<T>> = T extends any | ||
? TPath extends `${infer K}.${infer R}` | ||
? K extends keyof T | ||
? R extends Path<T[K]> | ||
? PathValue<T[K], R> | ||
: never | ||
: K extends `${ArrayKey}` | ||
? T extends readonly (infer V)[] | ||
? PathValue<V, R & Path<V>> | ||
: never | ||
: never | ||
: TPath extends keyof T | ||
? T[TPath] | ||
: TPath extends `${ArrayKey}` | ||
? T extends readonly (infer V)[] | ||
? V | ||
: never | ||
: never | ||
: never |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
72530
2147