remeda
Version:
A utility library for JavaScript and Typescript.
19 lines (16 loc) • 1.11 kB
TypeScript
import { C as CoercedArray } from './CoercedArray-DRz3tqda.js';
import { I as IterableContainer } from './IterableContainer-CtfinwiH.js';
import { T as TupleParts } from './TupleParts-BeowYtF7.js';
type FilteredArray<T extends IterableContainer, Condition> = T extends unknown ? [
...FilteredFixedTuple<TupleParts<T>["required"], Condition>,
...FilteredFixedTuple<TupleParts<T>["optional"], Condition>,
...CoercedArray<SymmetricRefine<TupleParts<T>["item"], Condition>>,
...FilteredFixedTuple<TupleParts<T>["suffix"], Condition>
] : never;
type FilteredFixedTuple<T, Condition, Output extends Array<unknown> = []> = T extends readonly [infer Head, ...infer Rest] ? FilteredFixedTuple<Rest, Condition, Head extends Condition ? [
...Output,
Head
] : Head | Condition extends object ? Output : Condition extends Head ? // But for any other type (mostly primitives), if the condition
Output | [...Output, Condition] : Output> : Output;
type SymmetricRefine<Item, Condition> = Item extends Condition ? Item : Condition extends Item ? Condition : never;
export type { FilteredArray as F };