import { ISetNextTick } from "./interfaces"; export let setNextTick: ISetNextTick; if (setImmediate === undefined) { setNextTick = function(fn: Function, ...args: any[]): void { setTimeout(fn, 0, ...args); }; } else { setNextTick = setImmediate; } /** * Wrap and limit a function to be called only once. */ export function once(callback: T): T { let called: boolean = false; let ret: any = function(...args: any[]): void { if (called) { throw new Error("Duplicated invocation to a invoked callback."); } called = true; (callback)(...args); }; return ret; }