@selfage/once
Version:
Calling functions only once.
45 lines • 4.31 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OnceOrErrorCaller = exports.OnceCaller = void 0;
class OnceCaller {
constructor(func, altFunc) {
this.func = func;
this.altFunc = altFunc;
this.call = this.callFirstTime;
}
callFirstTime(...args) {
this.result = this.func(...args);
if (this.altFunc) {
this.call = this.altFunc;
}
else {
this.call = this.callNoop;
}
return this.result;
}
callNoop() {
return this.result;
}
reset() {
this.call = this.callFirstTime;
}
}
exports.OnceCaller = OnceCaller;
class OnceOrErrorCaller {
constructor(func) {
this.func = func;
// this.fail can be passed directly because it doesn't use any class member.
this.onceCaller = new OnceCaller(this.func, this.fail);
}
call(...args) {
return this.onceCaller.call(...args);
}
fail() {
throw new Error("Function is expected to be called only once.");
}
reset() {
this.onceCaller.reset();
}
}
exports.OnceOrErrorCaller = OnceOrErrorCaller;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2FsbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsVUFBVTtJQUtyQixZQUNVLElBQXVCLEVBQ3ZCLE9BQTJCO1FBRDNCLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQW9CO1FBTjlCLFNBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBTzlCLENBQUM7SUFFSSxhQUFhLENBQUMsR0FBRyxJQUFPO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxRQUFRO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQTNCRCxnQ0EyQkM7QUFFRCxNQUFhLGlCQUFpQjtJQUk1QixZQUEyQixJQUF1QjtRQUF2QixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUhsRCw0RUFBNEU7UUFDcEUsZUFBVSxHQUFHLElBQUksVUFBVSxDQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRVgsQ0FBQztJQUUvQyxJQUFJLENBQUMsR0FBRyxJQUFPO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sSUFBSTtRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBakJELDhDQWlCQyIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgQXJyID0gcmVhZG9ubHkgdW5rbm93bltdO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9uY2VDYWxsZXI8VCBleHRlbmRzIEFyciwgUj4ge1xyXG4gIHB1YmxpYyBjYWxsID0gdGhpcy5jYWxsRmlyc3RUaW1lO1xyXG5cclxuICBwcml2YXRlIHJlc3VsdDogUjtcclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmdW5jOiAoLi4uYXJnczogVCkgPT4gUixcclxuICAgIHByaXZhdGUgYWx0RnVuYz86ICguLi5hcmdzOiBUKSA9PiBSXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGNhbGxGaXJzdFRpbWUoLi4uYXJnczogVCk6IFIge1xyXG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmZ1bmMoLi4uYXJncyk7XHJcbiAgICBpZiAodGhpcy5hbHRGdW5jKSB7XHJcbiAgICAgIHRoaXMuY2FsbCA9IHRoaXMuYWx0RnVuYztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FsbCA9IHRoaXMuY2FsbE5vb3A7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGxOb29wKCk6IFIge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYWxsID0gdGhpcy5jYWxsRmlyc3RUaW1lO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE9uY2VPckVycm9yQ2FsbGVyPFQgZXh0ZW5kcyBBcnIsIFI+IHtcclxuICAvLyB0aGlzLmZhaWwgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSBiZWNhdXNlIGl0IGRvZXNuJ3QgdXNlIGFueSBjbGFzcyBtZW1iZXIuXHJcbiAgcHJpdmF0ZSBvbmNlQ2FsbGVyID0gbmV3IE9uY2VDYWxsZXI8VCwgUj4odGhpcy5mdW5jLCB0aGlzLmZhaWwpO1xyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBmdW5jOiAoLi4uYXJnczogVCkgPT4gUikge31cclxuXHJcbiAgcHVibGljIGNhbGwoLi4uYXJnczogVCk6IFIge1xyXG4gICAgcmV0dXJuIHRoaXMub25jZUNhbGxlci5jYWxsKC4uLmFyZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmYWlsKCk6IFIge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIG9ubHkgb25jZS5cIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uY2VDYWxsZXIucmVzZXQoKTtcclxuICB9XHJcbn1cclxuIl19