@technobuddha/library
Version:
A large library of useful functions
70 lines (69 loc) • 2.47 kB
TypeScript
import { type Primitive } from 'type-fest';
/**
* Represents a primitive type that excludes `null` and `undefined`.
* @see Primitive
* @group Array
* @category Operations
*/
export type CollapsiblePrimitive = Exclude<Primitive, null | undefined>;
/**
* A `CollapsibleValue<T>`
*
* A `CollapsibleValue<T>` can be:
* - A single value of type `T`
* - `null`
* - `undefined`
* - An iterable object returning T | null | undefined
* @typeParam T - The primitive type that can be collapsed.
* @group Array
* @category Operations
*/
export type CollapsibleValue<T extends CollapsiblePrimitive> = T | null | undefined | Iterable<T | null | undefined>;
/**
* Represents a value that can be "collapsed" into a flat sequence of values of type `T`.
*
* A `Collapsible<T>` can be:
* - A single value of type `T`
* - `null` or `undefined`
* - An array of values (and/or `null`/`undefined`)
* - A function returning any of the above
* - An iterable yielding values (and/or `null`/`undefined`)
*
* This type is useful for APIs that accept flexible input forms, such as single values,
* arrays, lazy generators, or functions producing values, and need to process them uniformly.
* @typeParam T - The primitive type that can be collapsed.
* @group Array
* @category Operations
*/
export type Collapsible<T extends CollapsiblePrimitive> = CollapsibleValue<T> | (() => CollapsibleValue<T>);
/**
* Collapses an array of values into a flat array with `null` and `undefined` elements removed.
*
* Each argument can be:
* - `T`
* - `null`
* - `undefined`
* - a function returning `T` or `null` or `undefined` or an array
* - An iterable returning `T` or `null` or `undefined`
*
* The function flattens all arguments, filters out `null`, and `undefined` values,
* and returns the resulting array.
* @typeParam T - The primitive type that can be collapsed.
* @param args - The values to collapse, which may be `T`, generators, iterables, or functions.
* @returns An array of `T`, with all `null`, and `undefined` values removed.
* @example
* ```typescript
* collapse(
* "hello",
* ["world", null, "foo"],
* function* () { yield "bar"; yield undefined; yield ["baz"]; },
* () => "qux",
* null,
* undefined
* );
* // Returns: ["hello", "world", "foo", "bar", "baz", "qux"]
* ```
* @group Array
* @category Operations
*/
export declare function collapse<T extends CollapsiblePrimitive = string>(...args: Collapsible<T>[]): T[];