@openhps/core
Version:
Open Hybrid Positioning System - Core component
57 lines • 2.03 kB
JavaScript
import { __decorate } from "tslib";
import { Unit } from './Unit';
import { SerializableObject } from '../../data/decorators';
/**
* Derived Unit
* @category Unit
*/
let DerivedUnit = class DerivedUnit extends Unit {
constructor() {
super(...arguments);
this._units = new Map();
this._unitPower = new Map();
}
addUnit(unit, power) {
if (this._units.has(unit.baseName)) {
throw new Error(`A unit with base name '${unit.baseName}' already exists for this unit!`);
}
this._units.set(unit.baseName, unit);
this._unitPower.set(unit.baseName, power);
return this;
}
swap(subunits, options) {
if (Unit.UNITS.has(options.name)) {
return Unit.UNITS.get(options.name);
}
const UnitConstructor = Object.getPrototypeOf(this).constructor;
const unit = new UnitConstructor();
unit._name = options.name;
unit._baseName = this.baseName;
unit._aliases = options.aliases ? options.aliases : [];
const definition = {
unit: this.name,
toUnit: undefined,
fromUnit: undefined
};
subunits.forEach(subunit => {
const currentUnit = this._units.get(subunit.baseName);
const unitPower = this._unitPower.get(subunit.baseName);
const newDefinition = subunit.createDefinition(currentUnit);
const newToFn = value => Math.pow(newDefinition.toUnit(value), unitPower);
const newFromFn = value => Math.pow(newDefinition.fromUnit(value), unitPower);
const existingToFn = definition.toUnit;
const existingFromFn = definition.fromUnit;
if (existingToFn && existingFromFn) {
definition.toUnit = value => existingToFn(newToFn(value));
definition.fromUnit = value => existingFromFn(newFromFn(value));
} else {
definition.toUnit = newToFn;
definition.fromUnit = newFromFn;
}
});
unit._definitions.set(this.name, definition);
return Unit.registerUnit(unit);
}
};
DerivedUnit = __decorate([SerializableObject()], DerivedUnit);
export { DerivedUnit };