596 lines
20 KiB
JavaScript
596 lines
20 KiB
JavaScript
|
import { $ as constant, a0 as interpolateNumber, a1 as color, a2 as interpolateRgb, a3 as interpolateString } from "./mermaid-dcacb631.js";
|
|||
|
import { i as initRange } from "./init-cc95ec8e.js";
|
|||
|
function ascending(a, b) {
|
|||
|
return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
|
|||
|
}
|
|||
|
function descending(a, b) {
|
|||
|
return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
|
|||
|
}
|
|||
|
function bisector(f) {
|
|||
|
let compare1, compare2, delta;
|
|||
|
if (f.length !== 2) {
|
|||
|
compare1 = ascending;
|
|||
|
compare2 = (d, x) => ascending(f(d), x);
|
|||
|
delta = (d, x) => f(d) - x;
|
|||
|
} else {
|
|||
|
compare1 = f === ascending || f === descending ? f : zero;
|
|||
|
compare2 = f;
|
|||
|
delta = f;
|
|||
|
}
|
|||
|
function left(a, x, lo = 0, hi = a.length) {
|
|||
|
if (lo < hi) {
|
|||
|
if (compare1(x, x) !== 0)
|
|||
|
return hi;
|
|||
|
do {
|
|||
|
const mid = lo + hi >>> 1;
|
|||
|
if (compare2(a[mid], x) < 0)
|
|||
|
lo = mid + 1;
|
|||
|
else
|
|||
|
hi = mid;
|
|||
|
} while (lo < hi);
|
|||
|
}
|
|||
|
return lo;
|
|||
|
}
|
|||
|
function right(a, x, lo = 0, hi = a.length) {
|
|||
|
if (lo < hi) {
|
|||
|
if (compare1(x, x) !== 0)
|
|||
|
return hi;
|
|||
|
do {
|
|||
|
const mid = lo + hi >>> 1;
|
|||
|
if (compare2(a[mid], x) <= 0)
|
|||
|
lo = mid + 1;
|
|||
|
else
|
|||
|
hi = mid;
|
|||
|
} while (lo < hi);
|
|||
|
}
|
|||
|
return lo;
|
|||
|
}
|
|||
|
function center(a, x, lo = 0, hi = a.length) {
|
|||
|
const i = left(a, x, lo, hi - 1);
|
|||
|
return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;
|
|||
|
}
|
|||
|
return { left, center, right };
|
|||
|
}
|
|||
|
function zero() {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
function number$1(x) {
|
|||
|
return x === null ? NaN : +x;
|
|||
|
}
|
|||
|
const ascendingBisect = bisector(ascending);
|
|||
|
const bisectRight = ascendingBisect.right;
|
|||
|
bisector(number$1).center;
|
|||
|
const bisect = bisectRight;
|
|||
|
const e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);
|
|||
|
function tickSpec(start, stop, count) {
|
|||
|
const step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log10(step)), error = step / Math.pow(10, power), factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;
|
|||
|
let i1, i2, inc;
|
|||
|
if (power < 0) {
|
|||
|
inc = Math.pow(10, -power) / factor;
|
|||
|
i1 = Math.round(start * inc);
|
|||
|
i2 = Math.round(stop * inc);
|
|||
|
if (i1 / inc < start)
|
|||
|
++i1;
|
|||
|
if (i2 / inc > stop)
|
|||
|
--i2;
|
|||
|
inc = -inc;
|
|||
|
} else {
|
|||
|
inc = Math.pow(10, power) * factor;
|
|||
|
i1 = Math.round(start / inc);
|
|||
|
i2 = Math.round(stop / inc);
|
|||
|
if (i1 * inc < start)
|
|||
|
++i1;
|
|||
|
if (i2 * inc > stop)
|
|||
|
--i2;
|
|||
|
}
|
|||
|
if (i2 < i1 && 0.5 <= count && count < 2)
|
|||
|
return tickSpec(start, stop, count * 2);
|
|||
|
return [i1, i2, inc];
|
|||
|
}
|
|||
|
function ticks(start, stop, count) {
|
|||
|
stop = +stop, start = +start, count = +count;
|
|||
|
if (!(count > 0))
|
|||
|
return [];
|
|||
|
if (start === stop)
|
|||
|
return [start];
|
|||
|
const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);
|
|||
|
if (!(i2 >= i1))
|
|||
|
return [];
|
|||
|
const n = i2 - i1 + 1, ticks2 = new Array(n);
|
|||
|
if (reverse) {
|
|||
|
if (inc < 0)
|
|||
|
for (let i = 0; i < n; ++i)
|
|||
|
ticks2[i] = (i2 - i) / -inc;
|
|||
|
else
|
|||
|
for (let i = 0; i < n; ++i)
|
|||
|
ticks2[i] = (i2 - i) * inc;
|
|||
|
} else {
|
|||
|
if (inc < 0)
|
|||
|
for (let i = 0; i < n; ++i)
|
|||
|
ticks2[i] = (i1 + i) / -inc;
|
|||
|
else
|
|||
|
for (let i = 0; i < n; ++i)
|
|||
|
ticks2[i] = (i1 + i) * inc;
|
|||
|
}
|
|||
|
return ticks2;
|
|||
|
}
|
|||
|
function tickIncrement(start, stop, count) {
|
|||
|
stop = +stop, start = +start, count = +count;
|
|||
|
return tickSpec(start, stop, count)[2];
|
|||
|
}
|
|||
|
function tickStep(start, stop, count) {
|
|||
|
stop = +stop, start = +start, count = +count;
|
|||
|
const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);
|
|||
|
return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);
|
|||
|
}
|
|||
|
function numberArray(a, b) {
|
|||
|
if (!b)
|
|||
|
b = [];
|
|||
|
var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i;
|
|||
|
return function(t) {
|
|||
|
for (i = 0; i < n; ++i)
|
|||
|
c[i] = a[i] * (1 - t) + b[i] * t;
|
|||
|
return c;
|
|||
|
};
|
|||
|
}
|
|||
|
function isNumberArray(x) {
|
|||
|
return ArrayBuffer.isView(x) && !(x instanceof DataView);
|
|||
|
}
|
|||
|
function genericArray(a, b) {
|
|||
|
var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i;
|
|||
|
for (i = 0; i < na; ++i)
|
|||
|
x[i] = interpolate(a[i], b[i]);
|
|||
|
for (; i < nb; ++i)
|
|||
|
c[i] = b[i];
|
|||
|
return function(t) {
|
|||
|
for (i = 0; i < na; ++i)
|
|||
|
c[i] = x[i](t);
|
|||
|
return c;
|
|||
|
};
|
|||
|
}
|
|||
|
function date(a, b) {
|
|||
|
var d = /* @__PURE__ */ new Date();
|
|||
|
return a = +a, b = +b, function(t) {
|
|||
|
return d.setTime(a * (1 - t) + b * t), d;
|
|||
|
};
|
|||
|
}
|
|||
|
function object(a, b) {
|
|||
|
var i = {}, c = {}, k;
|
|||
|
if (a === null || typeof a !== "object")
|
|||
|
a = {};
|
|||
|
if (b === null || typeof b !== "object")
|
|||
|
b = {};
|
|||
|
for (k in b) {
|
|||
|
if (k in a) {
|
|||
|
i[k] = interpolate(a[k], b[k]);
|
|||
|
} else {
|
|||
|
c[k] = b[k];
|
|||
|
}
|
|||
|
}
|
|||
|
return function(t) {
|
|||
|
for (k in i)
|
|||
|
c[k] = i[k](t);
|
|||
|
return c;
|
|||
|
};
|
|||
|
}
|
|||
|
function interpolate(a, b) {
|
|||
|
var t = typeof b, c;
|
|||
|
return b == null || t === "boolean" ? constant(b) : (t === "number" ? interpolateNumber : t === "string" ? (c = color(b)) ? (b = c, interpolateRgb) : interpolateString : b instanceof color ? interpolateRgb : b instanceof Date ? date : isNumberArray(b) ? numberArray : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object : interpolateNumber)(a, b);
|
|||
|
}
|
|||
|
function interpolateRound(a, b) {
|
|||
|
return a = +a, b = +b, function(t) {
|
|||
|
return Math.round(a * (1 - t) + b * t);
|
|||
|
};
|
|||
|
}
|
|||
|
function formatDecimal(x) {
|
|||
|
return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString("en").replace(/,/g, "") : x.toString(10);
|
|||
|
}
|
|||
|
function formatDecimalParts(x, p) {
|
|||
|
if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0)
|
|||
|
return null;
|
|||
|
var i, coefficient = x.slice(0, i);
|
|||
|
return [
|
|||
|
coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
|
|||
|
+x.slice(i + 1)
|
|||
|
];
|
|||
|
}
|
|||
|
function exponent(x) {
|
|||
|
return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;
|
|||
|
}
|
|||
|
function formatGroup(grouping, thousands) {
|
|||
|
return function(value, width) {
|
|||
|
var i = value.length, t = [], j = 0, g = grouping[0], length = 0;
|
|||
|
while (i > 0 && g > 0) {
|
|||
|
if (length + g + 1 > width)
|
|||
|
g = Math.max(1, width - length);
|
|||
|
t.push(value.substring(i -= g, i + g));
|
|||
|
if ((length += g + 1) > width)
|
|||
|
break;
|
|||
|
g = grouping[j = (j + 1) % grouping.length];
|
|||
|
}
|
|||
|
return t.reverse().join(thousands);
|
|||
|
};
|
|||
|
}
|
|||
|
function formatNumerals(numerals) {
|
|||
|
return function(value) {
|
|||
|
return value.replace(/[0-9]/g, function(i) {
|
|||
|
return numerals[+i];
|
|||
|
});
|
|||
|
};
|
|||
|
}
|
|||
|
var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
|
|||
|
function formatSpecifier(specifier) {
|
|||
|
if (!(match = re.exec(specifier)))
|
|||
|
throw new Error("invalid format: " + specifier);
|
|||
|
var match;
|
|||
|
return new FormatSpecifier({
|
|||
|
fill: match[1],
|
|||
|
align: match[2],
|
|||
|
sign: match[3],
|
|||
|
symbol: match[4],
|
|||
|
zero: match[5],
|
|||
|
width: match[6],
|
|||
|
comma: match[7],
|
|||
|
precision: match[8] && match[8].slice(1),
|
|||
|
trim: match[9],
|
|||
|
type: match[10]
|
|||
|
});
|
|||
|
}
|
|||
|
formatSpecifier.prototype = FormatSpecifier.prototype;
|
|||
|
function FormatSpecifier(specifier) {
|
|||
|
this.fill = specifier.fill === void 0 ? " " : specifier.fill + "";
|
|||
|
this.align = specifier.align === void 0 ? ">" : specifier.align + "";
|
|||
|
this.sign = specifier.sign === void 0 ? "-" : specifier.sign + "";
|
|||
|
this.symbol = specifier.symbol === void 0 ? "" : specifier.symbol + "";
|
|||
|
this.zero = !!specifier.zero;
|
|||
|
this.width = specifier.width === void 0 ? void 0 : +specifier.width;
|
|||
|
this.comma = !!specifier.comma;
|
|||
|
this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;
|
|||
|
this.trim = !!specifier.trim;
|
|||
|
this.type = specifier.type === void 0 ? "" : specifier.type + "";
|
|||
|
}
|
|||
|
FormatSpecifier.prototype.toString = function() {
|
|||
|
return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width === void 0 ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision === void 0 ? "" : "." + Math.max(0, this.precision | 0)) + (this.trim ? "~" : "") + this.type;
|
|||
|
};
|
|||
|
function formatTrim(s) {
|
|||
|
out:
|
|||
|
for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
|
|||
|
switch (s[i]) {
|
|||
|
case ".":
|
|||
|
i0 = i1 = i;
|
|||
|
break;
|
|||
|
case "0":
|
|||
|
if (i0 === 0)
|
|||
|
i0 = i;
|
|||
|
i1 = i;
|
|||
|
break;
|
|||
|
default:
|
|||
|
if (!+s[i])
|
|||
|
break out;
|
|||
|
if (i0 > 0)
|
|||
|
i0 = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
|
|||
|
}
|
|||
|
var prefixExponent;
|
|||
|
function formatPrefixAuto(x, p) {
|
|||
|
var d = formatDecimalParts(x, p);
|
|||
|
if (!d)
|
|||
|
return x + "";
|
|||
|
var coefficient = d[0], exponent2 = d[1], i = exponent2 - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;
|
|||
|
return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0];
|
|||
|
}
|
|||
|
function formatRounded(x, p) {
|
|||
|
var d = formatDecimalParts(x, p);
|
|||
|
if (!d)
|
|||
|
return x + "";
|
|||
|
var coefficient = d[0], exponent2 = d[1];
|
|||
|
return exponent2 < 0 ? "0." + new Array(-exponent2).join("0") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + "." + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join("0");
|
|||
|
}
|
|||
|
const formatTypes = {
|
|||
|
"%": (x, p) => (x * 100).toFixed(p),
|
|||
|
"b": (x) => Math.round(x).toString(2),
|
|||
|
"c": (x) => x + "",
|
|||
|
"d": formatDecimal,
|
|||
|
"e": (x, p) => x.toExponential(p),
|
|||
|
"f": (x, p) => x.toFixed(p),
|
|||
|
"g": (x, p) => x.toPrecision(p),
|
|||
|
"o": (x) => Math.round(x).toString(8),
|
|||
|
"p": (x, p) => formatRounded(x * 100, p),
|
|||
|
"r": formatRounded,
|
|||
|
"s": formatPrefixAuto,
|
|||
|
"X": (x) => Math.round(x).toString(16).toUpperCase(),
|
|||
|
"x": (x) => Math.round(x).toString(16)
|
|||
|
};
|
|||
|
function identity$1(x) {
|
|||
|
return x;
|
|||
|
}
|
|||
|
var map = Array.prototype.map, prefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"];
|
|||
|
function formatLocale(locale2) {
|
|||
|
var group = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$1 : formatGroup(map.call(locale2.grouping, Number), locale2.thousands + ""), currencyPrefix = locale2.currency === void 0 ? "" : locale2.currency[0] + "", currencySuffix = locale2.currency === void 0 ? "" : locale2.currency[1] + "", decimal = locale2.decimal === void 0 ? "." : locale2.decimal + "", numerals = locale2.numerals === void 0 ? identity$1 : formatNumerals(map.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? "%" : locale2.percent + "", minus = locale2.minus === void 0 ? "−" : locale2.minus + "", nan = locale2.nan === void 0 ? "NaN" : locale2.nan + "";
|
|||
|
function newFormat(specifier) {
|
|||
|
specifier = formatSpecifier(specifier);
|
|||
|
var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero2 = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;
|
|||
|
if (type === "n")
|
|||
|
comma = true, type = "g";
|
|||
|
else if (!formatTypes[type])
|
|||
|
precision === void 0 && (precision = 12), trim = true, type = "g";
|
|||
|
if (zero2 || fill === "0" && align === "=")
|
|||
|
zero2 = true, fill = "0", align = "=";
|
|||
|
var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : "";
|
|||
|
var formatType = formatTypes[type], maybeSuffix = /[defgprs%]/.test(type);
|
|||
|
precision = precision === void 0 ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));
|
|||
|
function format2(value) {
|
|||
|
var valuePrefix = prefix, valueSuffix = suffix, i, n, c;
|
|||
|
if (type === "c") {
|
|||
|
valueSuffix = formatType(value) + valueSuffix;
|
|||
|
value = "";
|
|||
|
} else {
|
|||
|
value = +value;
|
|||
|
var valueNegative = value < 0 || 1 / value < 0;
|
|||
|
value = isNaN(value) ? nan : formatType(Math.abs(value), precision);
|
|||
|
if (trim)
|
|||
|
value = formatTrim(value);
|
|||
|
if (valueNegative && +value === 0 && sign !== "+")
|
|||
|
valueNegative = false;
|
|||
|
valuePrefix = (valueNegative ? sign === "(" ? sign : minus : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
|
|||
|
valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
|
|||
|
if (maybeSuffix) {
|
|||
|
i = -1, n = value.length;
|
|||
|
while (++i < n) {
|
|||
|
if (c = value.charCodeAt(i), 48 > c || c > 57) {
|
|||
|
valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
|
|||
|
value = value.slice(0, i);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (comma && !zero2)
|
|||
|
value = group(value, Infinity);
|
|||
|
var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : "";
|
|||
|
if (comma && zero2)
|
|||
|
value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
|
|||
|
switch (align) {
|
|||
|
case "<":
|
|||
|
value = valuePrefix + value + valueSuffix + padding;
|
|||
|
break;
|
|||
|
case "=":
|
|||
|
value = valuePrefix + padding + value + valueSuffix;
|
|||
|
break;
|
|||
|
case "^":
|
|||
|
value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);
|
|||
|
break;
|
|||
|
default:
|
|||
|
value = padding + valuePrefix + value + valueSuffix;
|
|||
|
break;
|
|||
|
}
|
|||
|
return numerals(value);
|
|||
|
}
|
|||
|
format2.toString = function() {
|
|||
|
return specifier + "";
|
|||
|
};
|
|||
|
return format2;
|
|||
|
}
|
|||
|
function formatPrefix2(specifier, value) {
|
|||
|
var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];
|
|||
|
return function(value2) {
|
|||
|
return f(k * value2) + prefix;
|
|||
|
};
|
|||
|
}
|
|||
|
return {
|
|||
|
format: newFormat,
|
|||
|
formatPrefix: formatPrefix2
|
|||
|
};
|
|||
|
}
|
|||
|
var locale;
|
|||
|
var format;
|
|||
|
var formatPrefix;
|
|||
|
defaultLocale({
|
|||
|
thousands: ",",
|
|||
|
grouping: [3],
|
|||
|
currency: ["$", ""]
|
|||
|
});
|
|||
|
function defaultLocale(definition) {
|
|||
|
locale = formatLocale(definition);
|
|||
|
format = locale.format;
|
|||
|
formatPrefix = locale.formatPrefix;
|
|||
|
return locale;
|
|||
|
}
|
|||
|
function precisionFixed(step) {
|
|||
|
return Math.max(0, -exponent(Math.abs(step)));
|
|||
|
}
|
|||
|
function precisionPrefix(step, value) {
|
|||
|
return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));
|
|||
|
}
|
|||
|
function precisionRound(step, max) {
|
|||
|
step = Math.abs(step), max = Math.abs(max) - step;
|
|||
|
return Math.max(0, exponent(max) - exponent(step)) + 1;
|
|||
|
}
|
|||
|
function constants(x) {
|
|||
|
return function() {
|
|||
|
return x;
|
|||
|
};
|
|||
|
}
|
|||
|
function number(x) {
|
|||
|
return +x;
|
|||
|
}
|
|||
|
var unit = [0, 1];
|
|||
|
function identity(x) {
|
|||
|
return x;
|
|||
|
}
|
|||
|
function normalize(a, b) {
|
|||
|
return (b -= a = +a) ? function(x) {
|
|||
|
return (x - a) / b;
|
|||
|
} : constants(isNaN(b) ? NaN : 0.5);
|
|||
|
}
|
|||
|
function clamper(a, b) {
|
|||
|
var t;
|
|||
|
if (a > b)
|
|||
|
t = a, a = b, b = t;
|
|||
|
return function(x) {
|
|||
|
return Math.max(a, Math.min(b, x));
|
|||
|
};
|
|||
|
}
|
|||
|
function bimap(domain, range, interpolate2) {
|
|||
|
var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
|
|||
|
if (d1 < d0)
|
|||
|
d0 = normalize(d1, d0), r0 = interpolate2(r1, r0);
|
|||
|
else
|
|||
|
d0 = normalize(d0, d1), r0 = interpolate2(r0, r1);
|
|||
|
return function(x) {
|
|||
|
return r0(d0(x));
|
|||
|
};
|
|||
|
}
|
|||
|
function polymap(domain, range, interpolate2) {
|
|||
|
var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1;
|
|||
|
if (domain[j] < domain[0]) {
|
|||
|
domain = domain.slice().reverse();
|
|||
|
range = range.slice().reverse();
|
|||
|
}
|
|||
|
while (++i < j) {
|
|||
|
d[i] = normalize(domain[i], domain[i + 1]);
|
|||
|
r[i] = interpolate2(range[i], range[i + 1]);
|
|||
|
}
|
|||
|
return function(x) {
|
|||
|
var i2 = bisect(domain, x, 1, j) - 1;
|
|||
|
return r[i2](d[i2](x));
|
|||
|
};
|
|||
|
}
|
|||
|
function copy(source, target) {
|
|||
|
return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());
|
|||
|
}
|
|||
|
function transformer() {
|
|||
|
var domain = unit, range = unit, interpolate$1 = interpolate, transform, untransform, unknown, clamp = identity, piecewise, output, input;
|
|||
|
function rescale() {
|
|||
|
var n = Math.min(domain.length, range.length);
|
|||
|
if (clamp !== identity)
|
|||
|
clamp = clamper(domain[0], domain[n - 1]);
|
|||
|
piecewise = n > 2 ? polymap : bimap;
|
|||
|
output = input = null;
|
|||
|
return scale;
|
|||
|
}
|
|||
|
function scale(x) {
|
|||
|
return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate$1)))(transform(clamp(x)));
|
|||
|
}
|
|||
|
scale.invert = function(y) {
|
|||
|
return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));
|
|||
|
};
|
|||
|
scale.domain = function(_) {
|
|||
|
return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();
|
|||
|
};
|
|||
|
scale.range = function(_) {
|
|||
|
return arguments.length ? (range = Array.from(_), rescale()) : range.slice();
|
|||
|
};
|
|||
|
scale.rangeRound = function(_) {
|
|||
|
return range = Array.from(_), interpolate$1 = interpolateRound, rescale();
|
|||
|
};
|
|||
|
scale.clamp = function(_) {
|
|||
|
return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;
|
|||
|
};
|
|||
|
scale.interpolate = function(_) {
|
|||
|
return arguments.length ? (interpolate$1 = _, rescale()) : interpolate$1;
|
|||
|
};
|
|||
|
scale.unknown = function(_) {
|
|||
|
return arguments.length ? (unknown = _, scale) : unknown;
|
|||
|
};
|
|||
|
return function(t, u) {
|
|||
|
transform = t, untransform = u;
|
|||
|
return rescale();
|
|||
|
};
|
|||
|
}
|
|||
|
function continuous() {
|
|||
|
return transformer()(identity, identity);
|
|||
|
}
|
|||
|
function tickFormat(start, stop, count, specifier) {
|
|||
|
var step = tickStep(start, stop, count), precision;
|
|||
|
specifier = formatSpecifier(specifier == null ? ",f" : specifier);
|
|||
|
switch (specifier.type) {
|
|||
|
case "s": {
|
|||
|
var value = Math.max(Math.abs(start), Math.abs(stop));
|
|||
|
if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value)))
|
|||
|
specifier.precision = precision;
|
|||
|
return formatPrefix(specifier, value);
|
|||
|
}
|
|||
|
case "":
|
|||
|
case "e":
|
|||
|
case "g":
|
|||
|
case "p":
|
|||
|
case "r": {
|
|||
|
if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop)))))
|
|||
|
specifier.precision = precision - (specifier.type === "e");
|
|||
|
break;
|
|||
|
}
|
|||
|
case "f":
|
|||
|
case "%": {
|
|||
|
if (specifier.precision == null && !isNaN(precision = precisionFixed(step)))
|
|||
|
specifier.precision = precision - (specifier.type === "%") * 2;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
return format(specifier);
|
|||
|
}
|
|||
|
function linearish(scale) {
|
|||
|
var domain = scale.domain;
|
|||
|
scale.ticks = function(count) {
|
|||
|
var d = domain();
|
|||
|
return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
|
|||
|
};
|
|||
|
scale.tickFormat = function(count, specifier) {
|
|||
|
var d = domain();
|
|||
|
return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
|
|||
|
};
|
|||
|
scale.nice = function(count) {
|
|||
|
if (count == null)
|
|||
|
count = 10;
|
|||
|
var d = domain();
|
|||
|
var i0 = 0;
|
|||
|
var i1 = d.length - 1;
|
|||
|
var start = d[i0];
|
|||
|
var stop = d[i1];
|
|||
|
var prestep;
|
|||
|
var step;
|
|||
|
var maxIter = 10;
|
|||
|
if (stop < start) {
|
|||
|
step = start, start = stop, stop = step;
|
|||
|
step = i0, i0 = i1, i1 = step;
|
|||
|
}
|
|||
|
while (maxIter-- > 0) {
|
|||
|
step = tickIncrement(start, stop, count);
|
|||
|
if (step === prestep) {
|
|||
|
d[i0] = start;
|
|||
|
d[i1] = stop;
|
|||
|
return domain(d);
|
|||
|
} else if (step > 0) {
|
|||
|
start = Math.floor(start / step) * step;
|
|||
|
stop = Math.ceil(stop / step) * step;
|
|||
|
} else if (step < 0) {
|
|||
|
start = Math.ceil(start * step) / step;
|
|||
|
stop = Math.floor(stop * step) / step;
|
|||
|
} else {
|
|||
|
break;
|
|||
|
}
|
|||
|
prestep = step;
|
|||
|
}
|
|||
|
return scale;
|
|||
|
};
|
|||
|
return scale;
|
|||
|
}
|
|||
|
function linear() {
|
|||
|
var scale = continuous();
|
|||
|
scale.copy = function() {
|
|||
|
return copy(scale, linear());
|
|||
|
};
|
|||
|
initRange.apply(scale, arguments);
|
|||
|
return linearish(scale);
|
|||
|
}
|
|||
|
export {
|
|||
|
copy as a,
|
|||
|
bisector as b,
|
|||
|
continuous as c,
|
|||
|
linear as l,
|
|||
|
tickStep as t
|
|||
|
};
|