import Deferred = require("./Deferred"); import Promise = require("./promise/Promise"); function when(value: T | Promise, callback?: ((result: T) => U | DojoJS.Thenable) | null, errback?: ((error: any) => U | DojoJS.Thenable | void) | null, progback?: ((progress: any) => void) | null): U | Promise { // @ts-ignore - checking if value has a 'then' method var isThenable = value && "function" == typeof value.then, isPromise = isThenable && value instanceof Promise; if (!isThenable) return arguments.length > 1 ? callback ? callback(value as T) as unknown as Promise : value as unknown as U : new Deferred().resolve(value as T) as unknown as Promise; if (!isPromise) { // @ts-ignore - checks if 'cancel' is a value. var u = new Deferred(value.cancel); // @ts-ignore - we know that 'then' must exist value.then(u.resolve, u.reject, u.progress); value = u.promise as Promise; } // @ts-ignore - we know that 'then' must exist return callback || errback || progback ? value.then(callback, errback, progback) : value; }; export = when;