import { Disposable, withIsDisposed } from '@typed/disposable' import { Future } from '@typed/future' export function futurify(fn: (cb: NodeCallback) => void): () => Future export function futurify( fn: (a: A, cb: NodeCallback) => void, ): (a: A) => Future export function futurify( fn: (a: A, b: B, cb: NodeCallback) => void, ): (a: A, b: B) => Future export function futurify( fn: (a: A, b: B, c: C, cb: NodeCallback) => void, ): (a: A, b: B, c: C) => Future export function futurify( fn: (a: A, b: B, c: C, d: D, cb: NodeCallback) => void, ): (a: A, b: B, c: C, d: D) => Future export function futurify( fn: (a: A, b: B, c: C, d: D, e: E, cb: NodeCallback) => void, ): (a: A, b: B, c: C, d: D, e: E) => Future export function futurify( fn: (a: A, b: B, c: C, d: D, e: E, f: F, cb: NodeCallback) => void, ): (a: A, b: B, c: C, d: D, e: E, f: F) => Future export function futurify( fn: (a: A, b: B, c: C, d: D, e: E, f: F, g: G, cb: NodeCallback) => void, ): (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => Future export function futurify(fn: A) { return (...args: any[]): Future => { return Future.create((reject, resolve) => { const disposable = Disposable.lazy() disposable.addDisposable( withIsDisposed((isDisposed) => { args.push((err: Error | null | undefined, value?: any) => { if (isDisposed()) { return } if (err) { return disposable.addDisposable(reject(err)) } return disposable.addDisposable(resolve(value!)) }) fn.apply(void 0, args as any) }), ) return disposable }) } } export type NodeCallback = (error: Error | null | undefined | void, value?: A) => void export type NodeCallbackFn = { (a: A, b: B, c: C, d: D, e: E, f: F, g: G, cb: NodeCallback): void (a: A, b: B, c: C, d: D, e: E, f: F, cb: NodeCallback): void (a: A, b: B, c: C, d: D, e: E, cb: NodeCallback): void (a: A, b: B, c: C, d: D, cb: NodeCallback): void (a: A, b: B, c: C, cb: NodeCallback): void (a: A, b: B, cb: NodeCallback): void (a: A, cb: NodeCallback): void (cb: NodeCallback): void }