/** * Wrap a value into a function that returns it * @param value The value to be wrapped */ export function fnOf(value: T): () => T { return () => value } /** * Wrap a value into a constructor that constructs it * @param value The value to be wrapped */ export function classOf(value: T): new () => T { value = Object(value) return new Proxy({} as any, { construct() { return value as any } }) } /** * Wrap a value so that its prototype is `proto``proto` * @param value The value to be wrapped * @param proto Prototype value */ export function protoOf(value: T, proto: P): T & P { proto = Object(proto) return new Proxy(Object(value), { getPrototypeOf() { return proto as any } }) } /** * Wrap a value into a promise */ export function promiseOf(): Promise /** * Wrap a value into a promise * @param value The value to be wrapped */ export function promiseOf(value: T | PromiseLike): Promise export function promiseOf(value?: any): any { return Promise.resolve(value) } /** * Box a value * @param boxof Wrapper function * @param value Value */ export function boxOf(boxof: (value: T) => B, value: T): B { return boxof(value) }