import { KeysOfType, Dict } from '@ts-std/types'; import { Result, Maybe } from '@ts-std/monads'; import { Indexable } from './common'; export declare type MapFunc = (element: T, index: number, array: T[]) => U; export declare type Unzip = { [K in keyof L]: L[K][]; }; export declare type ValueProducer = KeysOfType | MapFunc; export declare type SimpleProducer = KeysOfType | ((value: T) => U); declare global { interface Array { sum(this: number[]): number; sum(this: T[], key: ValueProducer): number; push_all(this: T[], ...others: T[][]): void; filter_map(this: T[], fn: MapFunc): U[]; flat_map(this: T[], fn: MapFunc): U[]; try_map(this: T[], fn: MapFunc>): Result; maybe_map(this: T[], fn: MapFunc>): Maybe; index_map(this: T[], fn: MapFunc): Dict; unique_index_map(this: T[], fn: MapFunc): Result, [string, T, T]>; maybe_find(this: T[], fn: MapFunc): Maybe; maybe_get(this: T[], index: number): Maybe; wrapping_get(this: T[], index: number): Maybe; index_by(this: T[], arg: ValueProducer): Dict; unique_index_by(this: T[], arg: ValueProducer): Result, [string, T, T]>; group_by(this: T[], arg: ValueProducer): Dict; group_by_map(this: T[], arg: MapFunc): Dict; split_by(this: T[], predicate: ValueProducer): [T[], T[]]; split_by_map(this: T[], predicate: MapFunc): [U[], U[]]; entries_to_dict(this: [string, T][]): Dict; unique_entries_to_dict(this: [string, T][]): Result, [string, T, T]>; unzip(this: L[]): Maybe>; sort_by(this: T[], key: SimpleProducer, order?: 'asc' | 'desc'): T[]; mutate_sort_by(this: T[], key: SimpleProducer, order?: 'asc' | 'desc'): T[]; } interface ArrayConstructor { zip_lenient(...arrays: Unzip): L[]; zip_equal(...arrays: Unzip): Result; } } export declare function make_key_accessor(arg: ValueProducer): MapFunc;