import { ImmutableAugmentedItem, Item, ItemsAddedPayload, ItemsRemovedPayload, ItemsUpdatedPayload } from '../stores/items-store/interfaces';
import { Subject } from 'rxjs';
import { DraftSortingOptions, ImmutableProcessedSortingOption, ItemsSortedPayload, ProcessedSortingOptions, SortedItemsChangedPayload, SortingOptionsChangedPayload, SortRange } from './interfaces';
import { SearchedItemsChangedPayload } from '../searcher/searcher/interfaces';
import { FieldsStore } from '../stores/fields-store/fields-store';
import { Searcher } from '../searcher/searcher/searcher';
/**
 * `Sorter` is responsible for sorting items.
 */
export declare class Sorter<T extends Item<T>> {
    protected readonly hasField: FieldsStore<T>['hasField'];
    protected readonly getSearchResults: Searcher<T>['getMutableItems'];
    protected readonly $searchedItemsChanged: Subject<SearchedItemsChangedPayload<T>>;
    protected readonly $itemsAdded: Subject<ItemsAddedPayload<T>>;
    protected readonly $itemsRemoved: Subject<ItemsRemovedPayload<T>>;
    protected readonly $itemsUpdated: Subject<ItemsUpdatedPayload<T>>;
    protected readonly _options: ProcessedSortingOptions<T, keyof T>[];
    protected readonly _sortingRanges: SortRange[][];
    readonly $sortingOptionsChanged: Subject<SortingOptionsChangedPayload<T>>;
    readonly $itemsSorted: Subject<ItemsSortedPayload<T>>;
    readonly $sortedItemsChanged: Subject<SortedItemsChangedPayload<T>>;
    constructor(hasField: FieldsStore<T>['hasField'], getSearchResults: Searcher<T>['getMutableItems'], $searchedItemsChanged: Subject<SearchedItemsChangedPayload<T>>, $itemsAdded: Subject<ItemsAddedPayload<T>>, $itemsRemoved: Subject<ItemsRemovedPayload<T>>, $itemsUpdated: Subject<ItemsUpdatedPayload<T>>);
    /**
     * Returns the current sorting options
     */
    getOptions(includingNoneOrdered?: boolean): Readonly<ImmutableProcessedSortingOption<T, keyof T>[]>;
    /**
     * Returns the keys of all current sorting options
     */
    getSortingFieldKeys(includingNoneOrdered?: boolean): (keyof T)[];
    /**
     * Returns the order of all current sorting options
     */
    getSortingFieldOrders(includingNoneOrdered?: boolean): ProcessedSortingOptions<T, keyof T>['order'][];
    /**
     * Returns the order of a specific sorting option
     */
    getSortingFieldOrder(indexOrKey: number | keyof T): ProcessedSortingOptions<T, keyof T>['order'] | undefined;
    /**
     * Returns whether a field is currently sorted
     */
    isFieldSorted(field: keyof T, includingNoneOrdered?: boolean): boolean;
    /**
     * Returns the current sorted items
     */
    getItems(): Readonly<ImmutableAugmentedItem<T>[]>;
    /**
     * Returns the current sorting ranges
     *
     * @remarks
     * This method is only for testing purposes
     */
    getSortingRanges(): Readonly<Readonly<Readonly<SortRange>[]>[]>;
    /**
     * Clears the sorting
     */
    clearSort(): void;
    /**
     * Sorts the items based on the provided options.
     */
    sort<K extends keyof T>(options: DraftSortingOptions<T, K>): void;
    /**
     * Sorts the items based on the current sorting options.
     */
    protected sortItems(optionsIndex: number): void;
    /**
     * Creates sorting ranges for nested sorting options.
     */
    protected makeSortingRangesForNestedSortingOptions(items: ImmutableAugmentedItem<T>[], currCompareFnForNestedMatch: ProcessedSortingOptions<T, keyof T>['customCompareFnForNestedMatch'], optionsIndex?: number): SortRange[];
    /**
     * Sorts the items based on the given compare function.
     */
    protected applySort<K extends keyof T>(items: ImmutableAugmentedItem<T>[], compareFn: ProcessedSortingOptions<T, K>['customCompareFn'], optionsIndex: number): ImmutableAugmentedItem<T>[];
    /**
     * Transform\\\\s the given draft options into processed options with meta-data.
     */
    protected processOptions<K extends keyof T>(options: DraftSortingOptions<T, K>): ProcessedSortingOptions<T, K>;
    /**
     * Performs the behavior for handling new and previously sorted fields.
     */
    protected addNewOptions<K extends keyof T>(options: ProcessedSortingOptions<T, K>): void;
    /**
     * Sorts the items based on the current sorting options.
     */
    protected handleSearchedItemsChange(): void;
}
