@tsdotnet/lazy
Version:
Lazy<T> and ResettableLazy<T> class for simplifying lazy initialization.
85 lines • 2.38 kB
JavaScript
;
/*!
* @author electricessence / https://github.com/electricessence/
* @license MIT
*/
Object.defineProperty(exports, "__esModule", { value: true });
const disposable_1 = require("@tsdotnet/disposable");
class ResolverBase extends disposable_1.DisposableBase {
constructor(valueFactory, _allowReset = false) {
super();
this._allowReset = _allowReset;
if (!valueFactory)
throw new Error('\'valueFactory\' cannot be null or undefined.');
this._resolveState = {
created: false,
factory: valueFactory
};
}
get isFaulted() {
return !!this._resolveState.error;
}
get error() {
return this.getError();
}
get isValueCreated() {
return !!this._resolveState.created;
}
get canReset() {
return this._allowReset && !!this._resolveState.factory;
}
getValue() {
this.assertIsAlive();
const state = this._resolveState;
if (state.error)
throw state.error;
if (state.created === null)
throw new Error('Recursion detected.');
else if (state.created)
return state.value;
const c = state.factory;
if (!c)
throw new Error('Unexpected resolution state.');
state.created = null;
try {
if (!this._allowReset)
delete state.factory;
const v = c();
state.value = v;
state.created = true;
delete state.error;
return v;
}
catch (ex) {
delete state.value;
state.created = false;
state.error = ex;
throw ex;
}
}
tryReset() {
if (!this._allowReset)
return false;
const state = this._resolveState;
if (!state.factory)
return false;
else {
state.created = false;
delete state.value;
delete state.error;
return true;
}
}
getError() {
return this._resolveState.error;
}
_onDispose() {
const state = this._resolveState;
delete state.factory;
delete state.value;
state.created = null;
Object.freeze(state);
}
}
exports.default = ResolverBase;
//# sourceMappingURL=ResolverBase.js.map