alwz
Version:
Extendable library for typecasting
61 lines (60 loc) • 1.89 kB
JavaScript
import Converter from './Converter.js';
import EV from './ErrorValue.js';
import Registry from './Registry.js';
/**
* @ignore
* @example
* const odd = new Converter((input) => typeof input === 'number' && Boolean(input % 2), () => 1);
* const even = new Converter((input) => typeof input === 'number' && !(input % 2), () => 2);
* const Aggregator = new Aggregator();
* aggregator.register('odd', odd);
* aggregator.register('even', even);
* aggregator.to('odd')(3); // 3
* aggregator.to('odd')(4); // 1
* aggregator.to('even')(4); // 4
* aggregator.to('even')(5); // 2
*/
export class Aggregator extends Registry {
constructor() {
super();
this.converter = (name) => {
if (this._items.has(name)) {
return this._items.get(name);
}
else {
throw new Aggregator.AbsentConverter('converter has not been registered', name);
}
};
this.to = (name) => this.converter(name).convert;
Object.freeze(this);
}
get converters() {
return Array.from(this._items);
}
register(name, converter) {
if (this._items.has(name)) {
throw new Aggregator.DuplicateConverter('converter has already been registered', name);
}
else {
if (converter instanceof Converter) {
this._items.set(name, converter);
}
else {
throw new Aggregator.InvalidConverter('must be an instance of Converter', converter);
}
}
return this;
}
unregister(name) {
this._items.delete(name);
return this;
}
}
Aggregator.DuplicateConverter = class extends EV {
};
Aggregator.InvalidConverter = class extends EV {
};
Aggregator.AbsentConverter = class extends EV {
};
export default Aggregator;
//# sourceMappingURL=Aggregator.js.map