UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

57 lines 2.03 kB
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 };