export = crossfilter; declare function crossfilter(records?: T[]): crossfilter.Crossfilter; declare namespace crossfilter { export type ComparableValue = string | number | boolean; export interface ComparableObject { valueOf(): ComparableValue; } export type NaturallyOrderedValue = ComparableValue | ComparableObject; export type Predicate = (record: T) => boolean; export type TSelectorValue = NaturallyOrderedValue | NaturallyOrderedValue[]; export type OrderedValueSelector = ( record: TRecord, ) => TValue; export type FilterValue = | NaturallyOrderedValue | [NaturallyOrderedValue, NaturallyOrderedValue] | Predicate; export interface Grouping { key: TKey; value: TValue; } export interface Group { top(k: number): Array>; all(): ReadonlyArray>; reduce( add: (p: TValue, v: TRecord, nf: boolean) => TValue, remove: (p: TValue, v: TRecord, nf: boolean) => TValue, initial: () => TValue, ): Group; reduceCount(): Group; reduceSum(selector: (record: TRecord) => number): Group; order(selector: (value: TValue) => NaturallyOrderedValue): Group; orderNatural(): Group; size(): number; dispose(): Group; } export interface GroupAll { reduce( add: (p: TValue, v: TRecord, nf: boolean) => TValue, remove: (p: TValue, v: TRecord, nf: boolean) => TValue, initial: () => TValue, ): GroupAll; reduceCount(): GroupAll; reduceSum(selector: (record: TRecord) => number): GroupAll; dispose(): GroupAll; value(): TValue; } export interface Dimension { filter(filterValue: FilterValue): Dimension; filterExact(value: TValue): Dimension; filterRange(range: [TValue, TValue]): Dimension; filterFunction(predicate: Predicate): Dimension; filterAll(): Dimension; currentFilter(): FilterValue | undefined; hasCurrentFilter(): boolean; top(k: number, offset?: number): TRecord[]; bottom(k: number, offset?: number): TRecord[]; group( groupValue?: (value: TValue) => TKey, ): Group; groupAll(): GroupAll; dispose(): Dimension; accessor(record: TRecord): NaturallyOrderedValue; id(): number; } export enum EventType { DATA_ADDED = 'dataAdded', DATA_REMOVED = 'dataRemoved', FILTERED = 'filtered', } export interface Crossfilter { add(records: T[]): Crossfilter; remove(predicate?: Predicate): void; dimension( selector: OrderedValueSelector, isArray?: boolean, ): Dimension; groupAll(): GroupAll; size(): number; all(): ReadonlyArray; allFiltered(): T[]; onChange(callback: (type: EventType) => void): () => void; isElementFiltered(index: number, ignoreDimensions?: number[]): boolean; } export type HeapSelector = (records: T[], lo: number, hi: number, k: number) => T[]; export interface Heap { (records: T[], lo: number, hi: number): T[]; sort(records: T[], lo: number, hi: number): T[]; } export type Sorter = (records: T[], lo: number, hi: number) => T[]; export type Bisection = (records: T[], record: T, lo: number, hi: number) => number; export interface Bisector extends Bisection { left: Bisection; right: Bisection; } export const version: string; namespace heap { export function by(selector: OrderedValueSelector): Heap; } export function heap(records: T[], lo: number, hi: number): T[]; namespace heapselect { export function by(selector: OrderedValueSelector): HeapSelector; } export function heapselect(records: T[], lo: number, hi: number, k: number): T[]; namespace bisect { export function by(selector: OrderedValueSelector): Bisector; } export function bisect(records: T[], record: T, lo: number, hi: number): number; export function permute(records: T[], index: number[], deep: number): T[]; }