@formatjs/ecma402-abstract
Version:
A collection of implementation for ECMAScript abstract operations
44 lines (43 loc) • 1.75 kB
JavaScript
import "../types/number.js";
import { invariant } from "../utils.js";
import { CollapseNumberRange } from "./CollapseNumberRange.js";
import { FormatApproximately } from "./FormatApproximately.js";
import { FormatNumeric } from "./FormatNumeric.js";
import { PartitionNumberPattern } from "./PartitionNumberPattern.js";
/**
* https://tc39.es/ecma402/#sec-partitionnumberrangepattern
*/
export function PartitionNumberRangePattern(numberFormat, x, y, { getInternalSlots }) {
// 1. Assert: x and y are both mathematical values.
invariant(!x.isNaN() && !y.isNaN(), "Input must be a number", RangeError);
const internalSlots = getInternalSlots(numberFormat);
// 3. Let xResult be ? PartitionNumberPattern(numberFormat, x).
const xResult = PartitionNumberPattern(internalSlots, x);
// 4. Let yResult be ? PartitionNumberPattern(numberFormat, y).
const yResult = PartitionNumberPattern(internalSlots, y);
if (FormatNumeric(internalSlots, x) === FormatNumeric(internalSlots, y)) {
const appxResult = FormatApproximately(internalSlots, xResult);
appxResult.forEach((el) => {
el.source = "shared";
});
return appxResult;
}
let result = [];
xResult.forEach((el) => {
el.source = "startRange";
result.push(el);
});
// 9. Let symbols be internalSlots.[[dataLocaleData]].[[numbers]].[[symbols]][internalSlots.[[numberingSystem]]].
const rangeSeparator = internalSlots.dataLocaleData.numbers.symbols[internalSlots.numberingSystem].rangeSign;
result.push({
type: "literal",
value: rangeSeparator,
source: "shared"
});
yResult.forEach((el) => {
el.source = "endRange";
result.push(el);
});
// 13. Return ? CollapseNumberRange(numberFormat, result).
return CollapseNumberRange(numberFormat, result, { getInternalSlots });
}