space-lift
Version:
TypeScript Array, Object, Map, Set, Union, Enum utils
35 lines (34 loc) • 2.29 kB
TypeScript
import { ArrayWrapper } from './array';
import { MapWrapper } from './map';
import { ObjectWrapper } from './object';
import { SetWrapper } from './set';
import { Wrapper } from './wrapper';
export declare type Lifted<T> = undefined extends T ? never : null extends T ? never : T extends Wrapper<infer W> ? LiftedValue<W> : LiftedValue<T>;
declare type AtomicObject = Function | Promise<any> | Date | RegExp | Boolean | Number | String;
declare type LiftedValue<T> = null extends T ? never : undefined extends T ? never : T extends AtomicObject ? T : T extends ReadonlyArray<any> ? ArrayWrapper<T> : T extends ReadonlyMap<infer K, infer V> ? MapWrapper<K, V, T> : T extends ReadonlySet<infer E> ? SetWrapper<E, T> : T extends object ? ObjectWrapper<T> : never;
interface Lift {
<T>(obj: ArrayWrapper<ReadonlyArray<T>>): ArrayWrapper<ReadonlyArray<T>>;
<T extends object>(obj: ObjectWrapper<T>): ObjectWrapper<T>;
<K, V, M extends ReadonlyMap<K, V>>(obj: MapWrapper<K, V, M>): MapWrapper<K, V, M>;
<T, S extends ReadonlySet<T>>(obj: SetWrapper<T, S>): SetWrapper<T, S>;
/** lift won't wrap primitives and some other non container-like objects */
<T extends AtomicObject>(obj: T): T;
/** Wraps an Array to provide a richer API. Unwrap with .value() **/
<T>(obj: T[]): ArrayWrapper<T[]>;
/** Wraps a readonly Array to provide a richer API. Unwrap with .value() **/
<T>(obj: ReadonlyArray<T>): ArrayWrapper<ReadonlyArray<T>>;
/** Wraps a Map to provide a richer API. Unwrap with .value() **/
<K, V>(obj: Map<K, V>): MapWrapper<K, V, Map<K, V>>;
/** Wraps a readonly Map to provide a richer API. Unwrap with .value() **/
<K, V>(obj: ReadonlyMap<K, V>): MapWrapper<K, V, ReadonlyMap<K, V>>;
/** Wraps a Set to provide a richer API. Unwrap with .value() **/
<T>(obj: Set<T>): SetWrapper<T, Set<T>>;
/** Wraps a readonly Set to provide a richer API. Unwrap with .value() **/
<T>(obj: ReadonlySet<T>): SetWrapper<T, ReadonlySet<T>>;
/** Wraps an Object to provide a richer API. Unwrap with .value() **/
<T extends object>(obj: T): ObjectWrapper<T>;
}
export declare const lift: Lift;
export declare type Pipe = typeof pipe;
export declare function pipe<T, R>(this: Wrapper<T>, func: (object: T) => R): Lifted<R>;
export {};