import type { RMap } from '@rimbu/collection-types/map';
import type { Streamable } from '@rimbu/stream';
import { type MultiSetBase, type MultiSetCreators } from '@rimbu/multiset/custom';
/**
 * A type-invariant immutable MultiSet of value type T.
 * In the MultiSet, each value can occur multiple times.
 * See the [MultiSet documentation](https://rimbu.org/docs/collections/multiset) and the [MultiSet API documentation](https://rimbu.org/api/rimbu/multiset/MultiSet/interface)
 * @typeparam T - the value type
 */
export interface MultiSet<T> extends MultiSetBase<T, MultiSet.Types> {
}
export declare namespace MultiSet {
    /**
     * A non-empty type-invariant immutable MultiSet of value type T.
     * In the MultiSet, each value can occur multiple times.
     * See the [MultiSet documentation](https://rimbu.org/docs/collections/multiset) and the [MultiSet API documentation](https://rimbu.org/api/rimbu/multiset/MultiSet/interface)
     * @typeparam T - the value type
     */
    interface NonEmpty<T> extends MultiSetBase.NonEmpty<T, MultiSet.Types>, Omit<MultiSet<T>, keyof MultiSetBase.NonEmpty<any, any>>, Streamable.NonEmpty<T> {
    }
    /**
     * A context instance for `MultiSet` implementations that acts as a factory for every instance of this
     * type of collection.
     * @typeparam UT - the upper value type bound for which the context can be used
     */
    interface Context<UT> extends MultiSetBase.Context<UT, MultiSet.Types> {
    }
    /**
     * A mutable `MultiSet` builder used to efficiently create new immutable instances.
     * See the [MultiSet documentation](https://rimbu.org/docs/collections/multiset) and the [MultiSet.Builder API documentation](https://rimbu.org/api/rimbu/multiset/MultiSet/Builder/interface)
     * @typeparam T - the value type
     */
    interface Builder<T> extends MultiSetBase.Builder<T, MultiSet.Types> {
    }
    /**
     * Utility interface that provides higher-kinded types for this collection.
     */
    interface Types extends MultiSetBase.Types {
        readonly normal: MultiSet<this['_T']>;
        readonly nonEmpty: MultiSet.NonEmpty<this['_T']>;
        readonly countMap: RMap<this['_T'], number>;
        readonly countMapNonEmpty: RMap.NonEmpty<this['_T'], number>;
        readonly context: MultiSet.Context<this['_T']>;
        readonly builder: MultiSet.Builder<this['_T']>;
    }
}
export declare const MultiSet: MultiSetCreators;
