// Type definitions for D3JS d3-array module 1.2 // Project: https://github.com/d3/d3-array // Definitions by: Alex Ford , Boris Yankov , Tom Wanzek // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // Last module patch version validated against: 1.2.0 // -------------------------------------------------------------------------- // Shared Types and Interfaces // -------------------------------------------------------------------------- /** * Administrivia: JavaScript primitive types and Date */ export type Primitive = number | string | boolean | Date; /** * Administrivia: anything with a valueOf(): number method is comparable, so we allow it in numeric operations */ export interface Numeric { valueOf(): number; } // -------------------------------------------------------------------------------------- // Descriptive Statistics // -------------------------------------------------------------------------------------- /** * Return the maximum value in the array of strings using natural order. */ export function max(array: ArrayLike): string | undefined; /** * Return the maximum value in the array of numbers using natural order. */ export function max(array: ArrayLike): T | undefined; /** * Return the maximum value in the array using natural order and a projection function to map values to strings. */ export function max(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => string | undefined | null): string | undefined; /** * Return the maximum value in the array using natural order and a projection function to map values to easily-sorted values. */ export function max(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => U | undefined | null): U | undefined; /** * Return the minimum value in the array using natural order. */ export function min(array: ArrayLike): string | undefined; /** * Return the minimum value in the array using natural order. */ export function min(array: ArrayLike): T | undefined; /** * Return the minimum value in the array using natural order. */ export function min(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => string | undefined | null): string | undefined; /** * Return the minimum value in the array using natural order. */ export function min(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => U | undefined | null): U | undefined; /** * Return the min and max simultaneously. */ export function extent(array: ArrayLike): [string, string] | [undefined, undefined]; /** * Return the min and max simultaneously. */ export function extent(array: ArrayLike): [T, T] | [undefined, undefined]; /** * Return the min and max simultaneously. */ export function extent(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => string | undefined | null): [string, string] | [undefined, undefined]; /** * Return the min and max simultaneously. */ export function extent(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => U | undefined | null): [U, U] | [undefined, undefined]; /** * Return the mean of an array of numbers */ export function mean(array: ArrayLike): number | undefined; export function mean(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => number | undefined | null): number | undefined; /** * Return the median of an array of numbers */ export function median(array: ArrayLike): number | undefined; export function median(array: ArrayLike, accessor: (element: T, i: number, array: ArrayLike) => number | undefined | null): number | undefined; /** * Returns the p-quantile of an array of numbers */ export function quantile(array: ArrayLike, p: number): number | undefined; export function quantile(array: ArrayLike, p: number, accessor: (element: T, i: number, array: ArrayLike) => number | undefined | null): number | undefined; /** * Compute the sum of an array of numbers. */ export function sum(array: ArrayLike): number; /** * Compute the sum of an array, using the given accessor to convert values to numbers. */ export function sum(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => number | undefined | null): number; /** * Compute the standard deviation, defined as the square root of the bias-corrected variance, of the given array of numbers. */ export function deviation(array: ArrayLike): number | undefined; /** * Compute the standard deviation, defined as the square root of the bias-corrected variance, of the given array, * using the given accessor to convert values to numbers. */ export function deviation(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => number | undefined | null): number | undefined; /** * Compute an unbiased estimator of the population variance of the given array of numbers. */ export function variance(array: ArrayLike): number | undefined; /** * Compute an unbiased estimator of the population variance of the given array, * using the given accessor to convert values to numbers. */ export function variance(array: ArrayLike, accessor: (datum: T, index: number, array: ArrayLike) => number | undefined | null): number | undefined; // -------------------------------------------------------------------------------------- // Searching Arrays // -------------------------------------------------------------------------------------- export function scan(array: ArrayLike, comparator?: (a: number, b: number) => number): number | undefined; export function scan(array: ArrayLike, comparator: (a: T, b: T) => number): number | undefined; export function bisectLeft(array: ArrayLike, x: number, lo?: number, hi?: number): number; export function bisectLeft(array: ArrayLike, x: string, lo?: number, hi?: number): number; export function bisectLeft(array: ArrayLike, x: Date, lo?: number, hi?: number): number; export function bisectRight(array: ArrayLike, x: number, lo?: number, hi?: number): number; export function bisectRight(array: ArrayLike, x: string, lo?: number, hi?: number): number; export function bisectRight(array: ArrayLike, x: Date, lo?: number, hi?: number): number; export const bisect: typeof bisectRight; export interface Bisector { left(array: ArrayLike, x: U, lo?: number, hi?: number): number; right(array: ArrayLike, x: U, lo?: number, hi?: number): number; } export function bisector(comparator: (a: T, b: U) => number): Bisector; export function bisector(accessor: (x: T) => U): Bisector; // NB. this is limited to primitive values due to D3's use of the <, >, and >= operators. Results get weird for object instances. /** * Compares two primitive values for sorting (in ascending order). */ export function ascending(a: Primitive | undefined, b: Primitive | undefined): number; // NB. this is limited to primitive values due to D3's use of the <, >, and >= operators. Results get weird for object instances. /** * Compares two primitive values for sorting (in ascending order). */ export function descending(a: Primitive | undefined, b: Primitive | undefined): number; // -------------------------------------------------------------------------------------- // Transforming Arrays // -------------------------------------------------------------------------------------- /** * Returns the Cartesian product of the two arrays a and b. * For each element i in the specified array a and each element j in the specified array b, in order, * it creates a two-element array for each pair. * * @param a First input array. * @param b Second input array. */ export function cross(a: ArrayLike, b: ArrayLike): Array<[S, T]>; /** * Returns the Cartesian product of the two arrays a and b. * For each element i in the specified array a and each element j in the specified array b, in order, * invokes the specified reducer function passing the element i and element j. * * @param a First input array. * @param b Second input array. * @param reducer A reducer function taking as input an element from "a" and "b" and returning a reduced value. */ export function cross(a: ArrayLike, b: ArrayLike, reducer: (a: S, b: T) => U): U[]; /** * Merges the specified arrays into a single array. */ export function merge(arrays: ArrayLike>): T[]; /** * For each adjacent pair of elements in the specified array, returns a new array of tuples of elements i and i - 1. * Returns the empty array if the input array has fewer than two elements. * * @param array Array of input elements */ export function pairs(array: ArrayLike): Array<[T, T]>; /** * For each adjacent pair of elements in the specified array, in order, invokes the specified reducer function passing the element i and element i - 1. * Returns the resulting array of pair-wise reduced elements. * Returns the empty array if the input array has fewer than two elements. * * @param array Array of input elements * @param reducer A reducer function taking as input to adjecent elements of the input array and returning a reduced value. */ export function pairs(array: ArrayLike, reducer: (a: T, b: T) => U): U[]; /** * Given the specified array, return an array corresponding to the list of indices in 'keys'. */ export function permute(array: { [key: number]: T }, keys: ArrayLike): T[]; /** * Given the specified object, return an array corresponding to the list of property names in 'keys'. */ export function permute(object: { [key: string]: T }, keys: ArrayLike): T[]; /** * Generates a 0-based numeric sequence. The output range does not include 'stop'. */ export function range(stop: number): number[]; /** * Generates a numeric sequence starting from the given start and stop values. 'step' defaults to 1. The output range does not include 'stop'. */ export function range(start: number, stop: number, step?: number): number[]; /** * Randomizes the order of the specified array using the Fisher–Yates shuffle. */ export function shuffle(array: T[], lo?: number, hi?: number): T[]; export function shuffle(array: Int8Array, lo?: number, hi?: number): Int8Array; export function shuffle(array: Uint8Array, lo?: number, hi?: number): Uint8Array; export function shuffle(array: Uint8ClampedArray, lo?: number, hi?: number): Uint8ClampedArray; export function shuffle(array: Int16Array, lo?: number, hi?: number): Int16Array; export function shuffle(array: Uint16Array, lo?: number, hi?: number): Uint16Array; export function shuffle(array: Int32Array, lo?: number, hi?: number): Int32Array; export function shuffle(array: Uint32Array, lo?: number, hi?: number): Uint32Array; export function shuffle(array: Float32Array, lo?: number, hi?: number): Float32Array; export function shuffle(array: Float64Array, lo?: number, hi?: number): Float64Array; /** * Generate an array of approximately count + 1 uniformly-spaced, nicely-rounded values between start and stop (inclusive). * Each value is a power of ten multiplied by 1, 2 or 5. See also d3.tickIncrement, d3.tickStep and linear.ticks. * * Ticks are inclusive in the sense that they may include the specified start and stop values if (and only if) they are exact, * nicely-rounded values consistent with the inferred step. More formally, each returned tick t satisfies start ≤ t and t ≤ stop. * * @param start Start value for ticks * @param stop Stop value for ticks * @param count count + 1 is the approximate number of ticks to be returned by d3.ticks. */ export function ticks(start: number, stop: number, count: number): number[]; /** * Returns the difference between adjacent tick values if the same arguments were passed to d3.ticks: * a nicely-rounded value that is a power of ten multiplied by 1, 2 or 5. * * Like d3.tickStep, except requires that start is always less than or equal to step, and if the tick step for the given start, * stop and count would be less than one, returns the negative inverse tick step instead. * * This method is always guaranteed to return an integer, and is used by d3.ticks to avoid guarantee that the returned tick values * are represented as precisely as possible in IEEE 754 floating point. * * @param start Start value for ticks * @param stop Stop value for ticks * @param count count + 1 is the approximate number of ticks to be returned by d3.ticks. */ export function tickIncrement(start: number, stop: number, count: number): number; /** * Returns the difference between adjacent tick values if the same arguments were passed to d3.ticks: * a nicely-rounded value that is a power of ten multiplied by 1, 2 or 5. * * Note that due to the limited precision of IEEE 754 floating point, the returned value may not be exact decimals; * use d3-format to format numbers for human consumption. * * @param start Start value for ticks * @param stop Stop value for ticks * @param count count + 1 is the approximate number of ticks to be returned by d3.ticks. */ export function tickStep(start: number, stop: number, count: number): number; /** * Transpose a matrix provided in Array of Arrays format. */ export function transpose(matrix: ArrayLike>): T[][]; /** * Returns an array of arrays, where the ith array contains the ith element from each of the argument arrays. * The returned array is truncated in length to the shortest array in arrays. If arrays contains only a single array, the returned array * contains one-element arrays. With no arguments, the returned array is empty. */ export function zip(...arrays: Array>): T[][]; // -------------------------------------------------------------------------------------- // Histogram // -------------------------------------------------------------------------------------- export interface Bin extends Array { x0: Value; x1: Value; } /** * Type definition for threshold generator which returns the count of recommended thresholds */ export type ThresholdCountGenerator = (values: ArrayLike, min?: number, max?: number) => number; /** * Type definition for threshold generator which returns an array of recommended thresholds */ export type ThresholdArrayGenerator = (values: ArrayLike, min?: Value, max?: Value) => Value[]; export interface HistogramGenerator { (data: ArrayLike): Array>; value(): (d: Datum, i: number, data: ArrayLike) => Value; value(valueAccessor: (d: Datum, i: number, data: ArrayLike) => Value): this; domain(): (values: ArrayLike) => [Value, Value]; domain(domain: [Value, Value]): this; domain(domainAccessor: (values: ArrayLike) => [Value, Value]): this; thresholds(): ThresholdCountGenerator | ThresholdArrayGenerator; /** * Divide the domain uniformly into approximately count bins. IMPORTANT: This threshold * setting approach only works, when the materialized values are numbers! * * Any threshold values outside the domain are ignored. The first bin.x0 is always equal to the minimum domain value, * and the last bin.x1 is always equal to the maximum domain value. * * @param count The desired number of uniform bins. */ thresholds(count: number): this; /** * Set a threshold accessor function, which returns the desired number of bins. * Divides the domain uniformly into approximately count bins. IMPORTANT: This threshold * setting approach only works, when the materialized values are numbers! * * Any threshold values outside the domain are ignored. The first bin.x0 is always equal to the minimum domain value, * and the last bin.x1 is always equal to the maximum domain value. * * @param count A function which accepts as arguments the array of materialized values, and * optionally the domain minimum and maximum. The function calcutates and returns the suggested * number of bins. */ thresholds(count: ThresholdCountGenerator): this; /** * Set the array of values to be used as thresholds in determining the bins. * * Any threshold values outside the domain are ignored. The first bin.x0 is always equal to the minimum domain value, * and the last bin.x1 is always equal to the maximum domain value. * * @param thresholds Array of threshold values used for binning. The elements must * be of the same type as the materialized values of the histogram. */ thresholds(thresholds: ArrayLike): this; /** * Set a threshold accessor function, which returns the array of values to be used as * thresholds in determining the bins. * * Any threshold values outside the domain are ignored. The first bin.x0 is always equal to the minimum domain value, * and the last bin.x1 is always equal to the maximum domain value. * * @param thresholds A function which accepts as arguments the array of materialized values, and * optionally the domain minimum and maximum. The function calcutates and returns the array of values to be used as * thresholds in determining the bins. */ thresholds(thresholds: ThresholdArrayGenerator): this; } export function histogram(): HistogramGenerator; export function histogram(): HistogramGenerator; // -------------------------------------------------------------------------------------- // Histogram Thresholds // -------------------------------------------------------------------------------------- export function thresholdFreedmanDiaconis(values: ArrayLike, min: number, max: number): number; // of type ThresholdCountGenerator export function thresholdScott(values: ArrayLike, min: number, max: number): number; // of type ThresholdCountGenerator export function thresholdSturges(values: ArrayLike): number; // of type ThresholdCountGenerator