UNPKG

@mui/x-charts

Version:

The community edition of MUI X Charts components.

167 lines (161 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.keyof = keyof; exports.scaleBand = scaleBand; var _d3Array = require("@mui/x-charts-vendor/d3-array"); /* eslint-disable func-names */ // Adapted from d3-scale v4.0.2 // https://github.com/d3/d3-scale/blob/d6904a4bde09e16005e0ad8ca3e25b10ce54fa0d/src/band.js function keyof(value) { if (Array.isArray(value)) { return JSON.stringify(value); } if (typeof value === 'object' && value !== null) { return value.valueOf(); } return value; } /** * Constructs a new band scale with the specified range, no padding, no rounding and center alignment. * The domain defaults to the empty domain. * If range is not specified, it defaults to the unit range [0, 1]. * * The generic corresponds to the data type of domain elements. * * @param range A two-element array of numeric values. */ /** * Constructs a new band scale with the specified domain and range, no padding, no rounding and center alignment. * * The generic corresponds to the data type of domain elements. * * @param domain Array of domain values. * @param range A two-element array of numeric values. */ function scaleBand(...args) { // @ts-expect-error, InternMap accepts two arguments, but its types are set as Map, which doesn't. let index = new _d3Array.InternMap(undefined, keyof); let domain = []; let ordinalRange = []; let r0 = 0; let r1 = 1; let step; let bandwidth; let isRound = false; let paddingInner = 0; let paddingOuter = 0; let align = 0.5; const scale = d => { const i = index.get(d); if (i === undefined) { return undefined; } return ordinalRange[i % ordinalRange.length]; }; const rescale = () => { const n = domain.length; const reverse = r1 < r0; const start = reverse ? r1 : r0; const stop = reverse ? r0 : r1; step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); if (isRound) { step = Math.floor(step); } const adjustedStart = start + (stop - start - step * (n - paddingInner)) * align; bandwidth = step * (1 - paddingInner); const finalStart = isRound ? Math.round(adjustedStart) : adjustedStart; const finalBandwidth = isRound ? Math.round(bandwidth) : bandwidth; bandwidth = finalBandwidth; const values = (0, _d3Array.range)(n).map(i => finalStart + step * i); ordinalRange = reverse ? values.reverse() : values; return scale; }; scale.domain = function (_) { if (!arguments.length) { return domain.slice(); } domain = []; // @ts-expect-error, InternMap accepts two arguments. index = new _d3Array.InternMap(undefined, keyof); for (const value of _) { if (index.has(value)) { continue; } index.set(value, domain.push(value) - 1); } return rescale(); }; scale.range = function (_) { if (!arguments.length) { return [r0, r1]; } const [v0, v1] = _; r0 = +v0; r1 = +v1; return rescale(); }; scale.rangeRound = function (_) { const [v0, v1] = _; r0 = +v0; r1 = +v1; isRound = true; return rescale(); }; scale.bandwidth = function () { return bandwidth; }; scale.step = function () { return step; }; scale.round = function (_) { if (!arguments.length) { return isRound; } isRound = !!_; return rescale(); }; scale.padding = function (_) { if (!arguments.length) { return paddingInner; } paddingInner = Math.min(1, paddingOuter = +_); return rescale(); }; scale.paddingInner = function (_) { if (!arguments.length) { return paddingInner; } paddingInner = Math.min(1, _); return rescale(); }; scale.paddingOuter = function (_) { if (!arguments.length) { return paddingOuter; } paddingOuter = +_; return rescale(); }; scale.align = function (_) { if (!arguments.length) { return align; } align = Math.max(0, Math.min(1, _)); return rescale(); }; scale.copy = () => { return scaleBand(domain, [r0, r1]).round(isRound).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align); }; // Initialize from arguments const [arg0, arg1] = args; if (args.length > 1) { scale.domain(arg0); scale.range(arg1); } else if (arg0) { scale.range(arg0); } else { rescale(); } return scale; }