import { Token } from '@rimbu/base';
import { OptLazy, OptLazyOr, type RelatedTo, Update } from '@rimbu/common';
import { type StreamSource } from '@rimbu/stream';
import type { SortedMap } from '@rimbu/sorted/map';
import type { SortedMapContext } from '@rimbu/sorted/map-custom';
import { SortedBuilder } from '@rimbu/sorted/common';
export declare class SortedMapBuilder<K, V> extends SortedBuilder<readonly [K, V]> implements SortedMap.Builder<K, V> {
    readonly context: SortedMapContext<K>;
    source?: undefined | SortedMap<K, V>;
    _entries?: undefined | (readonly [K, V])[];
    _children?: undefined | SortedMapBuilder<K, V>[];
    size: number;
    constructor(context: SortedMapContext<K>, source?: undefined | SortedMap<K, V>, _entries?: undefined | (readonly [K, V])[], _children?: undefined | SortedMapBuilder<K, V>[], size?: number);
    createNew(source?: undefined | SortedMap<K, V>, _entries?: undefined | (readonly [K, V])[], _children?: undefined | SortedMapBuilder<K, V>[], size?: undefined | number): SortedMapBuilder<K, V>;
    prepareMutate(): void;
    get children(): SortedMapBuilder<K, V>[];
    set children(value: SortedMapBuilder<K, V>[]);
    get: <UK, O>(key: RelatedTo<K, UK>, otherwise?: OptLazy<O>) => V | O;
    hasKey: <UK>(key: RelatedTo<K, UK>) => boolean;
    addEntry: (entry: readonly [K, V]) => boolean;
    addEntries: (source: StreamSource<readonly [K, V]>) => boolean;
    set: (key: K, value: V) => boolean;
    removeKey: <UK, O>(key: RelatedTo<K, UK>, otherwise?: OptLazy<O>) => V | O;
    removeKeys: <UK>(keys: StreamSource<RelatedTo<K, UK>>) => boolean;
    modifyAt: (key: K, options: {
        ifNew?: OptLazyOr<V, Token>;
        ifExists?: ((currentValue: V, remove: Token) => V | Token) | V;
    }) => boolean;
    updateAt: <O>(key: K, update: Update<V>, otherwise?: OptLazy<O>) => V | O;
    build: () => SortedMap<K, V>;
    buildMapValues: <V2>(f: (value: V, key: K) => V2) => SortedMap<K, V2>;
    addEntryInternal(entry: readonly [K, V]): boolean;
    removeInternal<O>(key: K, otherwise?: OptLazy<O>): V | O;
    modifyAtInternal(key: K, options: {
        ifNew?: OptLazyOr<V, Token>;
        ifExists?: ((currentValue: V, remove: Token) => V | Token) | V;
    }): boolean;
}
