From 1f07a44be64b7e0cd0d7e2ccaedaf9563afa4b0f Mon Sep 17 00:00:00 2001 From: Jonah Scheinerman Date: Sun, 19 May 2024 12:42:20 -0400 Subject: [PATCH] Rename metric -> SI (#192) * Rename metric -> SI * Fix build * Fix again --- docs/examples/measuresDimension.ts | 6 +-- docs/examples/measuresDimensionless.ts | 4 +- docs/examples/measuresScale.ts | 4 +- src/measure/genericMeasureFactory.ts | 2 +- src/measure/genericMeasureStatic.ts | 28 ++++--------- src/unit/__test__/trigTests.ts | 6 +-- src/unit/base.ts | 28 ++++++------- src/unit/quantities.ts | 58 ++++++++++++++++---------- src/unit/trig.ts | 6 +-- 9 files changed, 71 insertions(+), 71 deletions(-) diff --git a/docs/examples/measuresDimension.ts b/docs/examples/measuresDimension.ts index f203852..5e2d17c 100644 --- a/docs/examples/measuresDimension.ts +++ b/docs/examples/measuresDimension.ts @@ -1,9 +1,9 @@ -import { Measure, MetricSystem } from "safe-units"; +import { Measure, SIUnitSystem } from "safe-units"; // START -const meter = Measure.dimension(MetricSystem, "length"); +const meter = Measure.dimension(SIUnitSystem, "length"); console.log(meter); // 1 m -const second = Measure.dimension(MetricSystem, "time"); +const second = Measure.dimension(SIUnitSystem, "time"); console.log(second); // 1 s // END diff --git a/docs/examples/measuresDimensionless.ts b/docs/examples/measuresDimensionless.ts index 62d832d..6bbcda3 100644 --- a/docs/examples/measuresDimensionless.ts +++ b/docs/examples/measuresDimensionless.ts @@ -1,7 +1,7 @@ -import { Measure, MetricSystem, meters } from "safe-units"; +import { Measure, SIUnitSystem, meters } from "safe-units"; // START -const scalar = Measure.dimensionless(MetricSystem, 2); +const scalar = Measure.dimensionless(SIUnitSystem, 2); const distance = Measure.of(20, meters); const doubled = distance.times(scalar); // 40 m // END diff --git a/docs/examples/measuresScale.ts b/docs/examples/measuresScale.ts index 6e914f2..d74f3b3 100644 --- a/docs/examples/measuresScale.ts +++ b/docs/examples/measuresScale.ts @@ -1,9 +1,9 @@ -import { Measure, MetricSystem, seconds } from "safe-units"; +import { Measure, SIUnitSystem, seconds } from "safe-units"; // START const t = Measure.of(10, seconds); const doubledShort = t.scale(2); // 20 s -const doubledLong = t.times(Measure.dimensionless(MetricSystem, 2)); // 20 s +const doubledLong = t.times(Measure.dimensionless(SIUnitSystem, 2)); // 20 s // END console.log(doubledShort, doubledLong); diff --git a/src/measure/genericMeasureFactory.ts b/src/measure/genericMeasureFactory.ts index 75e2e2d..c73d88e 100644 --- a/src/measure/genericMeasureFactory.ts +++ b/src/measure/genericMeasureFactory.ts @@ -71,7 +71,7 @@ export function createMeasureType( const { createMeasure, isMeasure } = createMeasureClass(num); const common: GenericMeasureCommon = { - ...getGenericMeasureStaticMethods(), + ...getGenericMeasureStaticMethods(num), isMeasure, dimensionless: (unitSystem, value) => createMeasure(value, unitSystem.createDimensionlessUnit(), unitSystem), dimension: (unitSystem, dimension, symbol) => diff --git a/src/measure/genericMeasureStatic.ts b/src/measure/genericMeasureStatic.ts index a5575e4..eaa6113 100644 --- a/src/measure/genericMeasureStatic.ts +++ b/src/measure/genericMeasureStatic.ts @@ -1,5 +1,5 @@ -import { GenericMeasure } from "./genericMeasure"; -import { BinaryFn, PrefixFn, SpreadFn } from "./genericMeasureUtils"; +import { GenericMeasure, NumericOperations } from "./genericMeasure"; +import { BinaryFn, PrefixFn, SpreadFn, wrapBinaryFn, wrapReducerFn } from "./genericMeasureUtils"; import { DivideUnits, MultiplyUnits, Unit } from "./unitTypeArithmetic"; export interface GenericMeasureStatic { @@ -39,16 +39,13 @@ export interface GenericMeasureStatic { prefix(prefix: string, multiplier: N): PrefixFn; } -export const getGenericMeasureStaticMethods = (): GenericMeasureStatic => { - const add: BinaryFn = (left, right) => left.plus(right); - const min: BinaryFn = (min, curr) => (curr.lt(min) ? curr : min); - const max: BinaryFn = (max, curr) => (curr.gt(max) ? curr : max); +export const getGenericMeasureStaticMethods = (num: NumericOperations): GenericMeasureStatic => { return { - sum: reduce(add as any), - min: reduce(min as any), - max: reduce(max as any), - add, - subtract: (left, right) => left.minus(right), + sum: wrapReducerFn(num.add), + min: wrapReducerFn((left, right) => (num.compare(left, right) < 0 ? left : right)), + max: wrapReducerFn((left, right) => (num.compare(left, right) < 0 ? right : left)), + add: wrapBinaryFn(num.add), + subtract: wrapBinaryFn(num.sub), multiply: (left, right) => left.times(right), divide: (left, right) => left.over(right), prefix: (prefix, multiplier) => { @@ -59,12 +56,3 @@ export const getGenericMeasureStaticMethods = (): GenericMeasureStatic => }, }; }; - -export function reduce( - fn: >( - left: GenericMeasure, - right: GenericMeasure, - ) => GenericMeasure, -): SpreadFn { - return (first, ...rest) => rest.reduce(fn, first); -} diff --git a/src/unit/__test__/trigTests.ts b/src/unit/__test__/trigTests.ts index 4155a3b..dc59dec 100644 --- a/src/unit/__test__/trigTests.ts +++ b/src/unit/__test__/trigTests.ts @@ -1,14 +1,14 @@ import { Measure } from "../../measure/numberMeasure"; import { degrees, piRadians } from "../angle"; -import { MetricSystem, meters, radians } from "../base"; +import { SIUnitSystem, meters, radians } from "../base"; import * as Trig from "../trig"; describe("Trig", () => { const zeroRadians = Measure.of(0, radians); - const zero = Measure.dimensionless(MetricSystem, 0); + const zero = Measure.dimensionless(SIUnitSystem, 0); it("normal", () => { - expect(Trig.cos(zeroRadians)).toEqual(Measure.dimensionless(MetricSystem, 1)); + expect(Trig.cos(zeroRadians)).toEqual(Measure.dimensionless(SIUnitSystem, 1)); expect(Trig.sin(zeroRadians)).toEqual(zero); expect(Trig.tan(zeroRadians)).toEqual(zero); }); diff --git a/src/unit/base.ts b/src/unit/base.ts index 6c410fa..b4f1cd4 100644 --- a/src/unit/base.ts +++ b/src/unit/base.ts @@ -2,7 +2,7 @@ import { GenericMeasureType } from "../measure"; import { Measure } from "../measure/numberMeasure"; import { UnitSystem } from "../measure/unitSystem"; -const MetricSystemBasis = { +const SIUnitSystemBasis = { length: "m", mass: "kg", time: "s", @@ -15,23 +15,23 @@ const MetricSystemBasis = { memory: "b", } as const; -type MetricSystemBasis = typeof MetricSystemBasis; +type SIUnitSystemBasis = typeof SIUnitSystemBasis; -export interface MetricSystem extends MetricSystemBasis {} +export interface SIUnitSystem extends SIUnitSystemBasis {} -export const MetricSystem = UnitSystem.from(MetricSystemBasis); +export const SIUnitSystem = UnitSystem.from(SIUnitSystemBasis); export const createSIBaseUnits = (measure: GenericMeasureType) => ({ - meters: measure.dimension(MetricSystem, "length"), - kilograms: measure.dimension(MetricSystem, "mass"), - seconds: measure.dimension(MetricSystem, "time"), - amperes: measure.dimension(MetricSystem, "current"), - kelvin: measure.dimension(MetricSystem, "temperature"), - moles: measure.dimension(MetricSystem, "substance"), - candelas: measure.dimension(MetricSystem, "intensity"), - radians: measure.dimension(MetricSystem, "planeAngle"), - steradians: measure.dimension(MetricSystem, "solidAngle"), - bits: measure.dimension(MetricSystem, "memory"), + meters: measure.dimension(SIUnitSystem, "length"), + kilograms: measure.dimension(SIUnitSystem, "mass"), + seconds: measure.dimension(SIUnitSystem, "time"), + amperes: measure.dimension(SIUnitSystem, "current"), + kelvin: measure.dimension(SIUnitSystem, "temperature"), + moles: measure.dimension(SIUnitSystem, "substance"), + candelas: measure.dimension(SIUnitSystem, "intensity"), + radians: measure.dimension(SIUnitSystem, "planeAngle"), + steradians: measure.dimension(SIUnitSystem, "solidAngle"), + bits: measure.dimension(SIUnitSystem, "memory"), }); export const { meters, kilograms, seconds, amperes, kelvin, moles, candelas, radians, steradians, bits } = diff --git a/src/unit/quantities.ts b/src/unit/quantities.ts index 6dbed3a..23a4e43 100644 --- a/src/unit/quantities.ts +++ b/src/unit/quantities.ts @@ -1,57 +1,69 @@ import { GenericMeasure, LiftMeasure } from "../measure/genericMeasure"; import { Measure } from "../measure/numberMeasure"; import { DimensionlessUnit } from "../measure/unitTypeArithmetic"; -import * as Base from "./base"; +import { + amperes, + bits, + candelas, + kelvin, + kilograms, + meters, + moles, + radians, + seconds, + SIUnitSystem, + steradians, +} from "./base"; // Dimensionless /** A measure without any unit */ -export type Dimensionless = GenericMeasure>; -export const Dimensionless: Dimensionless = Measure.dimensionless(Base.MetricSystem, 1); +export type Dimensionless = GenericMeasure>; +export const Dimensionless: Dimensionless = Measure.dimensionless(SIUnitSystem, 1); // Base units /** meters */ -export type Length = LiftMeasure; -export const Length: Length = Base.meters; +export type Length = LiftMeasure; +export const Length: Length = meters; /** kilograms */ -export type Mass = LiftMeasure; -export const Mass: Mass = Base.kilograms; +export type Mass = LiftMeasure; +export const Mass: Mass = kilograms; /** seconds */ -export type Time = LiftMeasure; -export const Time: Time = Base.seconds; +export type Time = LiftMeasure; +export const Time: Time = seconds; /** Amperes */ -export type ElectricCurrent = LiftMeasure; -export const ElectricCurrent: ElectricCurrent = Base.amperes; +export type ElectricCurrent = LiftMeasure; +export const ElectricCurrent: ElectricCurrent = amperes; /** Kelvin */ -export type Temperature = LiftMeasure; -export const Temperature: Temperature = Base.kelvin; +export type Temperature = LiftMeasure; +export const Temperature: Temperature = kelvin; /** moles */ -export type AmountOfSubstance = LiftMeasure; -export const AmountOfSubstance: AmountOfSubstance = Base.moles; +export type AmountOfSubstance = LiftMeasure; +export const AmountOfSubstance: AmountOfSubstance = moles; /** candelas */ -export type LuminousIntensity = LiftMeasure; -export const LuminousIntensity: LuminousIntensity = Base.candelas; +export type LuminousIntensity = LiftMeasure; +export const LuminousIntensity: LuminousIntensity = candelas; /** bits */ -export type Memory = LiftMeasure; -export const Memory: Memory = Base.bits; +export type Memory = LiftMeasure; +export const Memory: Memory = bits; // Angular base units /** radians */ -export type PlaneAngle = LiftMeasure; -export const PlaneAngle: PlaneAngle = Base.radians; +export type PlaneAngle = LiftMeasure; +export const PlaneAngle: PlaneAngle = radians; /** steradians */ -export type SolidAngle = LiftMeasure; -export const SolidAngle: SolidAngle = Base.steradians; +export type SolidAngle = LiftMeasure; +export const SolidAngle: SolidAngle = steradians; // Derived units diff --git a/src/unit/trig.ts b/src/unit/trig.ts index 4fca2b8..e404c75 100644 --- a/src/unit/trig.ts +++ b/src/unit/trig.ts @@ -1,7 +1,7 @@ import { GenericMeasure } from "../measure/genericMeasure"; import { Measure } from "../measure/numberMeasure"; import { DimensionlessUnit } from "../measure/unitTypeArithmetic"; -import { MetricSystem, radians } from "./base"; +import { SIUnitSystem, radians } from "./base"; import { Length, PlaneAngle } from "./quantities"; /** @@ -56,10 +56,10 @@ export function atan2(y: Length, x: Length): PlaneAngle { return Measure.of(Math.atan2(y.value, x.value), radians); } -type Dimensionless = GenericMeasure>; +type Dimensionless = GenericMeasure>; function wrapTrigFn(f: (x: number) => number): (angle: PlaneAngle) => Dimensionless { - return angle => Measure.dimensionless(MetricSystem, f(angle.value)); + return angle => Measure.dimensionless(SIUnitSystem, f(angle.value)); } function wrapInverseTrigFn(f: (x: number) => number): (angle: Dimensionless) => PlaneAngle {