import { DataTypes } from "./DataTypes";
declare global {
    interface Array<T> {
        /**
         * Items do not exist in target array or reverse match
         * @param target Target array
         * @param round A round for both matches
         */
        different(target: Array<T>, round?: boolean): Array<T>;
        /**
         * Get max number item or number item property
         * @param field Object field to calculate
         */
        max(...field: T extends number ? [undefined?] : T extends object ? [DataTypes.Keys<T, number>] : [never]): number;
        /**
         * Get max field value item
         * @param field Object field to calculate
         */
        maxItem(field: T extends object ? DataTypes.Keys<T, number> : never): T | undefined;
        /**
         * Get min number item or number item property
         * @param field Object field to calculate
         */
        min(...field: T extends number ? [undefined?] : T extends object ? [DataTypes.Keys<T, number>] : [never]): number;
        /**
         * Get min field value item
         * @param field Object field to calculate
         */
        minItem(field: T extends object ? DataTypes.Keys<T, number> : never): T | undefined;
        /**
         * Remove items by value or condition
         * @param items Items to remove
         */
        remove(...items: ((T & (DataTypes.Basic | object)) | ((item: T) => boolean))[]): T[];
        /**
         * Sort by property
         * @param property Property
         * @param values Property values
         */
        sortByProperty<P extends keyof T>(property: P, values: T[P][]): T[];
        /**
         * Sum number items or number item properties
         * @param field Object field to calculate
         */
        sum(...field: T extends number ? [undefined?] : T extends object ? [DataTypes.Keys<T, number>] : [never]): number;
        /**
         * Toggle item in array
         * @param item Item to toggle
         * @param add If true, add the item, otherwise remove it
         * @param idField If item is an object, use this field to check for existence
         */
        toggleItem<const A extends true | false, const F = T extends object ? keyof T : never>(item: T | (F extends keyof T ? (A extends true ? T : T | T[F]) : T), add: A, idField?: F): Array<T>;
        /**
         * Make all items are unique
         * @param this Input array
         */
        toUnique(): Array<T>;
    }
}
/**
 * Array Utilities
 */
export declare namespace ArrayUtils {
    /**
     * Array 1 items do not exist in Array 2 or reverse match
     * @param a1 Array 1
     * @param a2 Array 2
     * @param round A round for both matches
     */
    function differences<T>(a1: T[], a2: T[], round?: boolean): T[];
    /**
     * Merge arrays, remove duplicates, and sort by the first array
     * @param sort Array to sort
     * @param param All arrays to merge
     * @returns Result
     */
    function mergeArrays<T>(sort: T[], ...param: T[][]): T[];
}
