import { URI } from "./uri.js";
export declare function getOrSet<K, V>(map: Map<K, V>, key: K, value: V): V;
export declare function mapToString<K, V>(map: Map<K, V>): string;
export declare function setToString<K>(set: Set<K>): string;
interface ResourceMapKeyFn {
    (resource: URI): string;
}
export declare class ResourceMap<T> implements Map<URI, T> {
    private static readonly defaultToKey;
    readonly [Symbol.toStringTag] = "ResourceMap";
    private readonly map;
    private readonly toKey;
    /**
     *
     * @param toKey Custom uri identity function, e.g use an existing `IExtUri#getComparison`-util
     */
    constructor(toKey?: ResourceMapKeyFn);
    /**
     *
     * @param other Another resource which this maps is created from
     * @param toKey Custom uri identity function, e.g use an existing `IExtUri#getComparison`-util
     */
    constructor(other?: ResourceMap<T>, toKey?: ResourceMapKeyFn);
    /**
     *
     * @param other Another resource which this maps is created from
     * @param toKey Custom uri identity function, e.g use an existing `IExtUri#getComparison`-util
     */
    constructor(entries?: readonly (readonly [
        URI,
        T
    ])[], toKey?: ResourceMapKeyFn);
    set(resource: URI, value: T): this;
    get(resource: URI): T | undefined;
    has(resource: URI): boolean;
    get size(): number;
    clear(): void;
    delete(resource: URI): boolean;
    forEach(clb: (value: T, key: URI, map: Map<URI, T>) => void, thisArg?: object): void;
    values(): MapIterator<T>;
    keys(): MapIterator<URI>;
    entries(): MapIterator<[
        URI,
        T
    ]>;
    [Symbol.iterator](): MapIterator<[
        URI,
        T
    ]>;
}
export declare class ResourceSet implements Set<URI> {
    readonly [Symbol.toStringTag]: string;
    private readonly _map;
    constructor(toKey?: ResourceMapKeyFn);
    constructor(entries: readonly URI[], toKey?: ResourceMapKeyFn);
    get size(): number;
    add(value: URI): this;
    clear(): void;
    delete(value: URI): boolean;
    forEach(callbackfn: (value: URI, value2: URI, set: Set<URI>) => void, thisArg?: unknown): void;
    has(value: URI): boolean;
    entries(): SetIterator<[
        URI,
        URI
    ]>;
    keys(): SetIterator<URI>;
    values(): SetIterator<URI>;
    [Symbol.iterator](): SetIterator<URI>;
}
export declare enum Touch {
    None = 0,
    AsOld = 1,
    AsNew = 2
}
export declare class LinkedMap<K, V> implements Map<K, V> {
    readonly [Symbol.toStringTag] = "LinkedMap";
    private _map;
    private _head;
    private _tail;
    private _size;
    private _state;
    constructor();
    clear(): void;
    isEmpty(): boolean;
    get size(): number;
    get first(): V | undefined;
    get last(): V | undefined;
    has(key: K): boolean;
    get(key: K, touch?: Touch): V | undefined;
    set(key: K, value: V, touch?: Touch): this;
    delete(key: K): boolean;
    remove(key: K): V | undefined;
    shift(): V | undefined;
    forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: unknown): void;
    keys(): MapIterator<K>;
    values(): MapIterator<V>;
    entries(): MapIterator<[
        K,
        V
    ]>;
    [Symbol.iterator](): MapIterator<[
        K,
        V
    ]>;
    protected trimOld(newSize: number): void;
    protected trimNew(newSize: number): void;
    private addItemFirst;
    private addItemLast;
    private removeItem;
    private touch;
    toJSON(): [
        K,
        V
    ][];
    fromJSON(data: [
        K,
        V
    ][]): void;
}
declare abstract class Cache<K, V> extends LinkedMap<K, V> {
    protected _limit: number;
    protected _ratio: number;
    constructor(limit: number, ratio?: number);
    get limit(): number;
    set limit(limit: number);
    get ratio(): number;
    set ratio(ratio: number);
    get(key: K, touch?: Touch): V | undefined;
    peek(key: K): V | undefined;
    set(key: K, value: V): this;
    protected checkTrim(): void;
    protected abstract trim(newSize: number): void;
}
export declare class LRUCache<K, V> extends Cache<K, V> {
    constructor(limit: number, ratio?: number);
    protected trim(newSize: number): void;
    set(key: K, value: V): this;
}
export declare class MRUCache<K, V> extends Cache<K, V> {
    constructor(limit: number, ratio?: number);
    protected trim(newSize: number): void;
    set(key: K, value: V): this;
}
export declare class CounterSet<T> {
    private map;
    add(value: T): CounterSet<T>;
    delete(value: T): boolean;
    has(value: T): boolean;
}
/**
 * A map that allows access both by keys and values.
 * **NOTE**: values need to be unique.
 */
export declare class BidirectionalMap<K, V> {
    private readonly _m1;
    private readonly _m2;
    constructor(entries?: readonly (readonly [
        K,
        V
    ])[]);
    clear(): void;
    set(key: K, value: V): void;
    get(key: K): V | undefined;
    getKey(value: V): K | undefined;
    delete(key: K): boolean;
    forEach(callbackfn: (value: V, key: K, map: BidirectionalMap<K, V>) => void, thisArg?: unknown): void;
    keys(): IterableIterator<K>;
    values(): IterableIterator<V>;
}
export declare class SetMap<K, V> {
    private map;
    add(key: K, value: V): void;
    delete(key: K, value: V): void;
    forEach(key: K, fn: (value: V) => void): void;
    get(key: K): ReadonlySet<V>;
}
export declare function mapsStrictEqualIgnoreOrder(a: Map<unknown, unknown>, b: Map<unknown, unknown>): boolean;
/**
 * A map that is addressable with an arbitrary number of keys. This is useful in high performance
 * scenarios where creating a composite key whenever the data is accessed is too expensive. For
 * example for a very hot function, constructing a string like `first-second-third` for every call
 * will cause a significant hit to performance.
 */
export declare class NKeyMap<TValue, TKeys extends (string | boolean | number)[]> {
    private _data;
    /**
     * Sets a value on the map. Note that unlike a standard `Map`, the first argument is the value.
     * This is because the spread operator is used for the keys and must be last..
     * @param value The value to set.
     * @param keys The keys for the value.
     */
    set(value: TValue, ...keys: [
        ...TKeys
    ]): void;
    get(...keys: [
        ...TKeys
    ]): TValue | undefined;
    clear(): void;
    values(): IterableIterator<TValue>;
    /**
     * Get a textual representation of the map for debugging purposes.
     */
    toString(): string;
}
export {};
