import { EventHandle } from './event-handle';
/**
 * Callback used by {@link Events} and {@link EventHandle} functions. Note the callback is limited to 8 arguments.
 *
 * @param arg1 - First argument that is passed from caller.
 * @param arg2 - Second argument that is passed from caller.
 * @param arg3 - Third argument that is passed from caller.
 * @param arg4 - Fourth argument that is passed from caller.
 * @param arg5 - Fifth argument that is passed from caller.
 * @param arg6 - Sixth argument that is passed from caller.
 * @param arg7 - Seventh argument that is passed from caller.
 * @param arg8 - Eighth argument that is passed from caller.
 */
export type HandleEvent = (arg1?: any, arg2?: any, arg3?: any, arg4?: any, arg5?: any, arg6?: any, arg7?: any, arg8?: any) => void;
/**
 * Base class for event handling, providing mechanisms to register, emit, and unbind events. This
 * class supports adding event listeners, emitting events with up to 8 arguments, and managing
 * multiple emitters.
 *
 * @example
 * // Create an instance of the Events class
 * const events = new Events();
 *
 * // Register an event listener
 * events.on('testEvent', (arg1, arg2) => {
 *     console.log('Event triggered with arguments:', arg1, arg2);
 * });
 *
 * // Emit the event
 * events.emit('testEvent', 'value1', 'value2');
 *
 * // Unbind the event listener
 * events.unbind('testEvent');
 */
declare class Events {
    private _suspendEvents;
    private _additionalEmitters;
    private _events;
    /**
     * Creates a new Events instance.
     */
    constructor();
    /**
     * Sets whether events are suspended. If true, the observer will not emit events when values
     * are set.
     */
    set suspendEvents(value: boolean);
    /**
     * Gets whether events are suspended.
     */
    get suspendEvents(): boolean;
    /**
     * Registers an event listener for the specified event name. If the event is emitted,
     * the callback function is executed with up to 8 arguments.
     *
     * @param name - The name of the event to listen for.
     * @param fn - The callback function to be executed when the event is emitted.
     * @returns An EventHandle object that can be used to unbind the event listener.
     *
     * @example
     * // Register an event listener
     * events.on('testEvent', (arg1, arg2) => {
     *     console.log('Event triggered with arguments:', arg1, arg2);
     * });
     *
     * // Emit the event
     * events.emit('testEvent', 'value1', 'value2');
     */
    on(name: string, fn: HandleEvent): EventHandle;
    /**
     * Registers a one-time event listener for the specified event name. The callback function is
     * executed the next time the event is emitted, and then automatically unbound.
     *
     * @param name - The name of the event to listen for.
     * @param fn - The callback function to be executed once when the event is emitted.
     * @returns An EventHandle object that can be used to unbind the event listener
     * before it is triggered.
     *
     * @example
     * // Register a one-time event listener
     * events.once('testEvent', (arg1, arg2) => {
     *     console.log('Event triggered once with arguments:', arg1, arg2);
     * });
     *
     * // Emit the event
     * events.emit('testEvent', 'value1', 'value2'); // The callback will be called and then unbound.
     *
     * // Emit the event again
     * events.emit('testEvent', 'value1', 'value2'); // The callback will not be called this time.
     */
    once(name: string, fn: HandleEvent): EventHandle;
    /**
     * Emits the specified event, executing all registered listeners for that event with the
     * provided arguments. If events are suspended, the emit operation will be ignored.
     *
     * @param name - The name of the event to emit.
     * @param arg0 - The first argument to pass to the event listeners.
     * @param arg1 - The second argument to pass to the event listeners.
     * @param arg2 - The third argument to pass to the event listeners.
     * @param arg3 - The fourth argument to pass to the event listeners.
     * @param arg4 - The fifth argument to pass to the event listeners.
     * @param arg5 - The sixth argument to pass to the event listeners.
     * @param arg6 - The seventh argument to pass to the event listeners.
     * @param arg7 - The eighth argument to pass to the event listeners.
     * @returns The current instance for chaining.
     *
     * @example
     * // Register an event listener
     * events.on('testEvent', (arg1, arg2) => {
     *     console.log('Event triggered with arguments:', arg1, arg2);
     * });
     *
     * // Emit the event
     * events.emit('testEvent', 'value1', 'value2');
     *
     * // Emit the event with more arguments
     * events.emit('testEvent', 'value1', 'value2', 'value3', 'value4');
     */
    emit(name: string, arg0?: any, arg1?: any, arg2?: any, arg3?: any, arg4?: any, arg5?: any, arg6?: any, arg7?: any): this;
    /**
     * Unbinds an event listener for the specified event name. If a callback function is provided,
     * only that specific listener is removed. If no callback is provided, all listeners for the
     * event are removed. If no event name is provided, all listeners for all events are removed.
     *
     * @param name - The name of the event to unbind. If not provided, all events are
     * unbound.
     * @param fn - The specific callback function to remove. If not provided, all
     * listeners for the event are removed.
     * @returns The current instance for chaining.
     *
     * @example
     * // Register an event listener
     * const callback = (arg1, arg2) => {
     *     console.log('Event triggered with arguments:', arg1, arg2);
     * };
     * events.on('testEvent', callback);
     *
     * // Unbind the specific event listener
     * events.unbind('testEvent', callback);
     *
     * // Unbind all listeners for a specific event
     * events.unbind('testEvent');
     *
     * // Unbind all listeners for all events
     * events.unbind();
     */
    unbind(name?: string, fn?: HandleEvent): this;
    /**
     * Adds another emitter. Any events fired by this instance will also be fired on the additional
     * emitter.
     *
     * @param emitter - The emitter
     */
    addEmitter(emitter: Events): void;
    /**
     * Removes emitter.
     *
     * @param emitter - The emitter
     */
    removeEmitter(emitter: Events): void;
}
export { Events };
