covertable
Version:
A flexible pairwise tool written in TypeScript
52 lines (51 loc) • 1.73 kB
TypeScript
import type { Controller } from "./controller";
export type ScalarType = number | string;
export type DictType = {
[s: string]: any;
};
export type ListType = {
[index: number]: any[];
};
export type SerialsType = Map<ScalarType, PairType>;
export type ParentsType = Map<number, ScalarType>;
export type IndicesType = Map<number, number>;
export type FilterRowType = {
[key: string]: any;
[index: number]: any;
};
export type ArrayTupleType = any[][];
export type ArrayObjectType = {
[s: string]: any[];
};
export type FactorsType = ArrayTupleType | ArrayObjectType;
export type SuggestRowType<T extends FactorsType> = T extends ArrayTupleType ? T[number][number][] : T extends ArrayObjectType ? {
[K in keyof T]: T[K][number];
} : unknown;
export type FilterType = (row: FilterRowType) => boolean;
export type SuggestFilterType<T extends FactorsType> = (row: SuggestRowType<T>) => boolean;
export type PairType = number[];
export type PairByKeyType = Map<ScalarType, PairType>;
export type CandidateType = [ScalarType, number][];
export interface RowType {
consumed: PairByKeyType;
}
export type SorterType = (pairs: PairType[], sortArgs: SortArgsType) => PairType[];
export interface SortArgsType {
seed: ScalarType;
indices: IndicesType;
}
export interface CriterionArgsType {
row: RowType;
parents: ParentsType;
length: number;
tolerance: number;
}
export interface OptionsType<T extends FactorsType> {
length?: number;
sorter?: SorterType;
criterion?: (ctrl: Controller<T>) => IterableIterator<PairType>;
seed?: ScalarType;
tolerance?: number;
preFilter?: FilterType | SuggestFilterType<T>;
postFilter?: FilterType | SuggestFilterType<T>;
}