@atomic-ehr/ucum
Version:
TypeScript implementation of UCUM (Unified Code for Units of Measure)
151 lines (150 loc) • 5.86 kB
JavaScript
// Dimension operations as pure functions
export const Dimension = {
// Create a dimension object from named parameters
create(dims = {}) {
// Return a normalized object (no undefined values)
const result = {};
if (dims.L !== undefined && dims.L !== 0)
result.L = dims.L;
if (dims.M !== undefined && dims.M !== 0)
result.M = dims.M;
if (dims.T !== undefined && dims.T !== 0)
result.T = dims.T;
if (dims.A !== undefined && dims.A !== 0)
result.A = dims.A;
if (dims.Θ !== undefined && dims.Θ !== 0)
result.Θ = dims.Θ;
if (dims.Q !== undefined && dims.Q !== 0)
result.Q = dims.Q;
if (dims.F !== undefined && dims.F !== 0)
result.F = dims.F;
return result;
},
// Multiply dimensions (add exponents)
multiply(a, b) {
return Dimension.create({
L: (a.L ?? 0) + (b.L ?? 0),
M: (a.M ?? 0) + (b.M ?? 0),
T: (a.T ?? 0) + (b.T ?? 0),
A: (a.A ?? 0) + (b.A ?? 0),
Θ: (a.Θ ?? 0) + (b.Θ ?? 0),
Q: (a.Q ?? 0) + (b.Q ?? 0),
F: (a.F ?? 0) + (b.F ?? 0)
});
},
// Divide dimensions (subtract exponents)
divide(a, b) {
return Dimension.create({
L: (a.L ?? 0) - (b.L ?? 0),
M: (a.M ?? 0) - (b.M ?? 0),
T: (a.T ?? 0) - (b.T ?? 0),
A: (a.A ?? 0) - (b.A ?? 0),
Θ: (a.Θ ?? 0) - (b.Θ ?? 0),
Q: (a.Q ?? 0) - (b.Q ?? 0),
F: (a.F ?? 0) - (b.F ?? 0)
});
},
// Raise dimension to a power (multiply all exponents)
power(dim, n) {
return Dimension.create({
L: dim.L !== undefined ? dim.L * n : undefined,
M: dim.M !== undefined ? dim.M * n : undefined,
T: dim.T !== undefined ? dim.T * n : undefined,
A: dim.A !== undefined ? dim.A * n : undefined,
Θ: dim.Θ !== undefined ? dim.Θ * n : undefined,
Q: dim.Q !== undefined ? dim.Q * n : undefined,
F: dim.F !== undefined ? dim.F * n : undefined
});
},
// Check if two dimensions are equal
equals(a, b) {
return (a.L ?? 0) === (b.L ?? 0) &&
(a.M ?? 0) === (b.M ?? 0) &&
(a.T ?? 0) === (b.T ?? 0) &&
(a.A ?? 0) === (b.A ?? 0) &&
(a.Θ ?? 0) === (b.Θ ?? 0) &&
(a.Q ?? 0) === (b.Q ?? 0) &&
(a.F ?? 0) === (b.F ?? 0);
},
// Check if dimension is dimensionless
isDimensionless(dim) {
return (dim.L ?? 0) === 0 &&
(dim.M ?? 0) === 0 &&
(dim.T ?? 0) === 0 &&
(dim.A ?? 0) === 0 &&
(dim.Θ ?? 0) === 0 &&
(dim.Q ?? 0) === 0 &&
(dim.F ?? 0) === 0;
},
// Convert to string representation
toString(dim) {
const parts = [];
// Process in standard order: L M T A Θ Q F
if (dim.L !== undefined && dim.L !== 0) {
parts.push(dim.L === 1 ? 'L' : `L^${dim.L}`);
}
if (dim.M !== undefined && dim.M !== 0) {
parts.push(dim.M === 1 ? 'M' : `M^${dim.M}`);
}
if (dim.T !== undefined && dim.T !== 0) {
parts.push(dim.T === 1 ? 'T' : `T^${dim.T}`);
}
if (dim.A !== undefined && dim.A !== 0) {
parts.push(dim.A === 1 ? 'A' : `A^${dim.A}`);
}
if (dim.Θ !== undefined && dim.Θ !== 0) {
parts.push(dim.Θ === 1 ? 'Θ' : `Θ^${dim.Θ}`);
}
if (dim.Q !== undefined && dim.Q !== 0) {
parts.push(dim.Q === 1 ? 'Q' : `Q^${dim.Q}`);
}
if (dim.F !== undefined && dim.F !== 0) {
parts.push(dim.F === 1 ? 'F' : `F^${dim.F}`);
}
return parts.length > 0 ? parts.join('·') : '1';
}
};
// Predefined dimension constants
export const Dimensions = {
// Base dimensions
DIMENSIONLESS: {},
LENGTH: { L: 1 },
MASS: { M: 1 },
TIME: { T: 1 },
ANGLE: { A: 1 },
TEMPERATURE: { Θ: 1 },
CHARGE: { Q: 1 },
LUMINOSITY: { F: 1 },
// Common derived dimensions
AREA: { L: 2 }, // L²
VOLUME: { L: 3 }, // L³
VELOCITY: { L: 1, T: -1 }, // L·T⁻¹
ACCELERATION: { L: 1, T: -2 }, // L·T⁻²
FORCE: { L: 1, M: 1, T: -2 }, // L·M·T⁻²
ENERGY: { L: 2, M: 1, T: -2 }, // L²·M·T⁻²
POWER: { L: 2, M: 1, T: -3 }, // L²·M·T⁻³
PRESSURE: { L: -1, M: 1, T: -2 }, // L⁻¹·M·T⁻²
FREQUENCY: { T: -1 }, // T⁻¹
ELECTRIC_POTENTIAL: { L: 2, M: 1, T: -3, Q: -1 }, // L²·M·T⁻³·Q⁻¹
ELECTRIC_RESISTANCE: { L: 2, M: 1, T: -3, Q: -2 }, // L²·M·T⁻³·Q⁻²
ELECTRIC_CONDUCTANCE: { L: -2, M: -1, T: 3, Q: 2 }, // L⁻²·M⁻¹·T³·Q²
ELECTRIC_CAPACITANCE: { L: -2, M: -1, T: 4, Q: 2 }, // L⁻²·M⁻¹·T⁴·Q²
};
// Keep the enum for backward compatibility if needed
export var DimensionType;
(function (DimensionType) {
DimensionType[DimensionType["L"] = 0] = "L";
DimensionType[DimensionType["Length"] = 0] = "Length";
DimensionType[DimensionType["M"] = 1] = "M";
DimensionType[DimensionType["Mass"] = 1] = "Mass";
DimensionType[DimensionType["T"] = 2] = "T";
DimensionType[DimensionType["Time"] = 2] = "Time";
DimensionType[DimensionType["A"] = 3] = "A";
DimensionType[DimensionType["Angle"] = 3] = "Angle";
DimensionType[DimensionType["Theta"] = 4] = "Theta";
DimensionType[DimensionType["Temperature"] = 4] = "Temperature";
DimensionType[DimensionType["Q"] = 5] = "Q";
DimensionType[DimensionType["Charge"] = 5] = "Charge";
DimensionType[DimensionType["F"] = 6] = "F";
DimensionType[DimensionType["Luminosity"] = 6] = "Luminosity";
})(DimensionType || (DimensionType = {}));