import {utils} from './utils'; /** * @namespace units * @type {{}} */ export const units = {}; /** * The default value for {@link CoordinateGridMixin#xUnits .xUnits} for the * {@link CoordinateGridMixin Coordinate Grid Chart} and should * be used when the x values are a sequence of integers. * It is a function that counts the number of integers in the range supplied in its start and end parameters. * @method integers * @memberof units * @see {@link CoordinateGridMixin#xUnits coordinateGridMixin.xUnits} * @example * chart.xUnits(units.integers) // already the default * @param {Number} start * @param {Number} end * @returns {Number} */ units.integers = function (start, end) { return Math.abs(end - start); }; /** * This argument can be passed to the {@link CoordinateGridMixin#xUnits .xUnits} function of a * coordinate grid chart to specify ordinal units for the x axis. Usually this parameter is used in * combination with passing * {@link https://github.com/d3/d3-scale/blob/master/README.md#ordinal-scales d3.scaleOrdinal} * to {@link CoordinateGridMixin#x .x}. * * As of dc.js 3.0, this is purely a placeholder or magic value which causes the chart to go into ordinal mode; the * function is not called. * @method ordinal * @memberof units * @return {uncallable} * @see {@link https://github.com/d3/d3-scale/blob/master/README.md#ordinal-scales d3.scaleOrdinal} * @see {@link CoordinateGridMixin#xUnits coordinateGridMixin.xUnits} * @see {@link CoordinateGridMixin#x coordinateGridMixin.x} * @example * chart.xUnits(units.ordinal) * .x(d3.scaleOrdinal()) */ units.ordinal = function () { throw new Error('dc.units.ordinal should not be called - it is a placeholder'); }; /** * @namespace fp * @memberof units * @type {{}} */ units.fp = {}; /** * This function generates an argument for the {@link CoordinateGridMixin Coordinate Grid Chart} * {@link CoordinateGridMixin#xUnits .xUnits} function specifying that the x values are floating-point * numbers with the given precision. * The returned function determines how many values at the given precision will fit into the range * supplied in its start and end parameters. * @method precision * @memberof units.fp * @see {@link CoordinateGridMixin#xUnits coordinateGridMixin.xUnits} * @example * // specify values (and ticks) every 0.1 units * chart.xUnits(units.fp.precision(0.1) * // there are 500 units between 0.5 and 1 if the precision is 0.001 * var thousandths = units.fp.precision(0.001); * thousandths(0.5, 1.0) // returns 500 * @param {Number} precision * @returns {Function} start-end unit function */ units.fp.precision = function (precision) { const _f = function (s, e) { const d = Math.abs((e - s) / _f.resolution); if (utils.isNegligible(d - Math.floor(d))) { return Math.floor(d); } else { return Math.ceil(d); } }; _f.resolution = precision; return _f; };