UNPKG

@vidal-community/vidal-web-components

Version:

Vidal Web Components

91 lines 4.09 kB
import { Dose } from '../model/dose'; export function useConversionService() { return conversionServiceInstance; } class ConversionService { constructor() { this.MAX_CONVERSION_STEP_LIMIT = 10; } findMatchingUnitUri(equivalentDrugUnits, prescriptionUnit) { for (const unit of equivalentDrugUnits) { if (unit.uri === prescriptionUnit.uri) { return unit.uri; } for (const conversionRate of unit.conversionRates) { if (conversionRate.refUnit.uri === prescriptionUnit.uri) { return conversionRate.refUnit.uri; } if (conversionRate.unit.uri === prescriptionUnit.uri) { return conversionRate.unit.uri; } } } return undefined; } convertDose(dose, targetUnit, conversionRate) { if (targetUnit === dose.unit.uri) { return dose; } if (conversionRate.length === 0) { return; } const refUnit = conversionRate[0].refUnit.uri; const convertedDose = new Dose(dose.value, dose.unit); let conversionSteps = 0; while (convertedDose.unit.uri !== targetUnit && conversionSteps < this.MAX_CONVERSION_STEP_LIMIT) { conversionSteps++; conversionRate.forEach((conversionRate) => { if (this.isDirectConversionPossibleByMultiplying(convertedDose.unit, conversionRate, targetUnit)) { convertedDose.value = this.multiplyDoseByCoeff(convertedDose.value, conversionRate); convertedDose.unit = conversionRate.unit; return; } if (this.isDirectConversionPossibleByDividing(convertedDose.unit, conversionRate, targetUnit) || this.isConversionToRefUnitPossibleByMultiplying(convertedDose.unit, conversionRate, refUnit)) { convertedDose.value = this.divideDoseByCoeff(convertedDose.value, conversionRate); convertedDose.unit = conversionRate.refUnit; return; } if (this.isConversionToRefUnitPossibleByDividing(refUnit, conversionRate, convertedDose.unit)) { convertedDose.value = this.multiplyDoseByCoeff(convertedDose.value, conversionRate); convertedDose.unit = conversionRate.refUnit; } }); } if (conversionSteps === this.MAX_CONVERSION_STEP_LIMIT) { console.error('For the next dose : ' + dose.toString() + ', the conversion could not be made to the target unit: ' + targetUnit); console.error('The associated conversion rates are: '); console.table(conversionRate); return; } return convertedDose; } isConversionToRefUnitPossibleByDividing(refUnit, conversionRate, unit) { return (refUnit === conversionRate.unit.uri && unit.uri === conversionRate.refUnit.uri); } isConversionToRefUnitPossibleByMultiplying(unit, conversionRate, refUnit) { return (unit.uri === conversionRate.unit.uri && refUnit === conversionRate.refUnit.uri); } isDirectConversionPossibleByDividing(unit, conversionRate, targetUnit) { return (unit.uri === conversionRate.unit.uri && targetUnit === conversionRate.refUnit.uri); } isDirectConversionPossibleByMultiplying(unit, conversionRate, targetUnit) { return (unit.uri === conversionRate.refUnit.uri && targetUnit === conversionRate.unit.uri); } divideDoseByCoeff(value, conversionRate) { return (value / conversionRate.numerator) * conversionRate.denominator; } multiplyDoseByCoeff(value, conversionRate) { return value * (conversionRate.numerator / conversionRate.denominator); } } const conversionServiceInstance = new ConversionService(); //# sourceMappingURL=conversion-service.js.map