import Evented from "@arcgis/core/core/Evented.js";
import type { EventHandler } from "../support/esri.js";
import type { AfterItemChangeEvent, ChangeEvent } from "./collection.js";
declare const ObservableSet_base: typeof Evented & (abstract new (...args: any[]) => import("../support/observableUtils.js").ObservableMixin);
/**
 * A Set that supports observability.
 */
export declare class ObservableSet<T> extends ObservableSet_base implements Set<T> {
    /**
     * Used by Object.toString().
     */
    readonly [Symbol.toStringTag] = "ObservableSet";
    /**
     * The number of elements in the set.
     */
    get size(): number;
    /**
     * The underlying set that this class is wrapping.
     */
    protected _originalSet: Set<T>;
    constructor();
    /**
     * Adds an element to the set.
     *
     * @param value The value to add.
     */
    add(value: T): this;
    /**
     * Adds elements to the set.
     *
     * @param values The values to add.
     */
    addMany(values: Iterable<T>): this;
    /**
     * Removes all elements.
     */
    clear(): void;
    /**
     * Removes the specified element.
     *
     * @param value The element to remove.
     * @returns True if an element was deleted, otherwise false.
     */
    delete(value: T): boolean;
    /**
     * Removes the specified elements.
     *
     * @param values The elements to remove.
     * @returns True if an element was deleted, otherwise false.
     */
    deleteMany(values: Iterable<T>): boolean;
    /**
     * Executes a provided function once per each element in the set.
     *
     * @param callbackfn Function to execute for each element.
     * @param thisArg Value to use as `this` when executing callback.
     */
    forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: unknown): void;
    /**
     * Indicates whether or not the set contains the specified element.
     *
     * @param value The element to test for.
     */
    has(value: T): boolean;
    /**
     * Returns each element in the set in insertion order.
     */
    entries(): SetIterator<[T, T]>;
    /**
     * Returns each element in the set in insertion order.
     */
    keys(): SetIterator<T>;
    /**
     * Returns each element in the set in insertion order.
     */
    values(): SetIterator<T>;
    /**
     * Returns each element in the set in insertion order.
     */
    [Symbol.iterator](): SetIterator<T>;
    /**
     * Returns a serializable representation of the set.
     */
    toJSON(): unknown;
    on(name: "change", callback: (event: ChangeEvent<T>) => void): IHandle;
    on(name: "after-add", callback: (event: AfterItemChangeEvent<this, T>) => void): IHandle;
    on(name: "after-remove", callback: (event: AfterItemChangeEvent<this, T>) => void): IHandle;
    on(name: string, callback: EventHandler): IHandle;
}
export {};
