Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 1x 1x 1x 5x 17x 17x 4x 17x 5x 17x | /* tslint:disable no-invalid-this */
const instances = new WeakMap<any, WeakMap<any, any>>();
/**
* A class method decorator that limits a method to be called only once. All
* subsequent calls will return the result of the first call.
*/
export function once<This, Args extends any[], Return>(
fn: (this: This, ...args: Args) => Return,
context?: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,
) {
return function (this: This, ...args: Args): Return {
let map = instances.get(this);
if (!map) instances.set(this, (map = new WeakMap<any, any>()));
if (!map.has(fn)) map.set(fn, fn.apply(this, args));
return map.get(fn);
};
}
|