spellNumber = {
let [_00, ..._000] = [
...new Map([...scales.entries()].sort((a, b) => a[0] - b[0])).values()
];
yield function (value = 0) {
if (+value === 0) {
return numerals.get(0);
}
if (value < 0 || value > Number.MAX_SAFE_INTEGER || value % 1 !== 0) {
throw RangeError(
`Only integers between 0 and ${Number.MAX_SAFE_INTEGER} are allowed`
);
}
const input = value + "";
const output = [];
for (let k = input.length - 1, n = 0; k >= 0; k--, n++) {
const key = +input[k];
const position = n % 3;
if (0 === key && position) {
continue;
}
switch (position) {
case 0:
if (n) {
-1 !== _000.indexOf(output[0]) && output.shift();
output.unshift(scales.get(n));
}
key > 0 && output.unshift(numerals.get(key));
break;
case 1: {
let [word, lookup] = [output.shift(), tens.get(key)];
if (typeof lookup === "string") {
if (-1 === digits.indexOf(word)) {
word && output.unshift(word);
} else {
lookup += "-" + word;
}
} else {
lookup = lookup.get(word);
}
output.unshift(lookup);
break;
}
case 2:
output.unshift([numerals.get(key), " ", _00].join(""));
break;
}
}
return output.join(" ");
};
}