import '../../assert/js/assert.js';
import '../../globals.js';
import TReadOnlyProperty from './TReadOnlyProperty.js';
type ROP<T> = TReadOnlyProperty<T>;
export type RP1<T1> = Readonly<[ROP<T1>]>;
export type RP2<T1, T2> = Readonly<[ROP<T1>, ROP<T2>]>;
export type RP3<T1, T2, T3> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>]>;
export type RP4<T1, T2, T3, T4> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>]>;
export type RP5<T1, T2, T3, T4, T5> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>]>;
export type RP6<T1, T2, T3, T4, T5, T6> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>]>;
export type RP7<T1, T2, T3, T4, T5, T6, T7> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>]>;
export type RP8<T1, T2, T3, T4, T5, T6, T7, T8> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>]>;
export type RP9<T1, T2, T3, T4, T5, T6, T7, T8, T9> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>]>;
export type RP10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>, ROP<T10>]>;
export type RP11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>, ROP<T10>, ROP<T11>]>;
export type RP12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>, ROP<T10>, ROP<T11>, ROP<T12>]>;
export type RP13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>, ROP<T10>, ROP<T11>, ROP<T12>, ROP<T13>]>;
export type RP14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>, ROP<T10>, ROP<T11>, ROP<T12>, ROP<T13>, ROP<T14>]>;
export type RP15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> = Readonly<[ROP<T1>, ROP<T2>, ROP<T3>, ROP<T4>, ROP<T5>, ROP<T6>, ROP<T7>, ROP<T8>, ROP<T9>, ROP<T10>, ROP<T11>, ROP<T12>, ROP<T13>, ROP<T14>, ROP<T15>]>;
export type Dependencies<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> = RP1<T1> | RP2<T1, T2> | RP3<T1, T2, T3> | RP4<T1, T2, T3, T4> | RP5<T1, T2, T3, T4, T5> | RP6<T1, T2, T3, T4, T5, T6> | RP7<T1, T2, T3, T4, T5, T6, T7> | RP8<T1, T2, T3, T4, T5, T6, T7, T8> | RP9<T1, T2, T3, T4, T5, T6, T7, T8, T9> | RP10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> | RP11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> | RP12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> | RP13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> | RP14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> | RP15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
export type UnknownMultilink = Multilink<unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown>;
export default class Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> {
    private dependencies;
    private dependencyListeners;
    private isDisposed?;
    /**
     * @param dependencies
     * @param callback function that expects args in the same order as dependencies
     * @param [lazy] Optional parameter that can be set to true if this should be a lazy multilink (no immediate callback)
     */
    constructor(dependencies: RP1<T1>, callback: (...params: [T1]) => void, lazy?: boolean);
    constructor(dependencies: RP2<T1, T2>, callback: (...params: [T1, T2]) => void, lazy?: boolean);
    constructor(dependencies: RP3<T1, T2, T3>, callback: (...params: [T1, T2, T3]) => void, lazy?: boolean);
    constructor(dependencies: RP4<T1, T2, T3, T4>, callback: (...params: [T1, T2, T3, T4]) => void, lazy?: boolean);
    constructor(dependencies: RP5<T1, T2, T3, T4, T5>, callback: (...params: [T1, T2, T3, T4, T5]) => void, lazy?: boolean);
    constructor(dependencies: RP6<T1, T2, T3, T4, T5, T6>, callback: (...params: [T1, T2, T3, T4, T5, T6]) => void, lazy?: boolean);
    constructor(dependencies: RP7<T1, T2, T3, T4, T5, T6, T7>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7]) => void, lazy?: boolean);
    constructor(dependencies: RP8<T1, T2, T3, T4, T5, T6, T7, T8>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8]) => void, lazy?: boolean);
    constructor(dependencies: RP9<T1, T2, T3, T4, T5, T6, T7, T8, T9>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9]) => void, lazy?: boolean);
    constructor(dependencies: RP10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) => void, lazy?: boolean);
    constructor(dependencies: RP11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]) => void, lazy?: boolean);
    constructor(dependencies: RP12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]) => void, lazy?: boolean);
    constructor(dependencies: RP13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]) => void, lazy?: boolean);
    constructor(dependencies: RP14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]) => void, lazy?: boolean);
    constructor(dependencies: RP15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]) => void, lazy?: boolean);
    constructor(dependencies: Dependencies<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]) => void, lazy?: boolean);
    /**
     * Returns dependencies that are guaranteed to be defined internally.
     */
    private get definedDependencies();
    dispose(): void;
    /**
     * Registers a listener with multiple properties, then notifies the listener immediately.
     * @param dependencies
     * @param callback function that takes values from the properties and returns nothing
     */
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP1<T1>, callback: (...params: [T1]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP2<T1, T2>, callback: (...params: [T1, T2]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP3<T1, T2, T3>, callback: (...params: [T1, T2, T3]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP4<T1, T2, T3, T4>, callback: (...params: [T1, T2, T3, T4]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP5<T1, T2, T3, T4, T5>, callback: (...params: [T1, T2, T3, T4, T5]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP6<T1, T2, T3, T4, T5, T6>, callback: (...params: [T1, T2, T3, T4, T5, T6]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP7<T1, T2, T3, T4, T5, T6, T7>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP8<T1, T2, T3, T4, T5, T6, T7, T8>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP9<T1, T2, T3, T4, T5, T6, T7, T8, T9>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    /**
     * Create a Multilink from a dynamic or unknown number of dependencies.
     */
    static multilinkAny(dependencies: Readonly<TReadOnlyProperty<unknown>[]>, callback: () => void): UnknownMultilink;
    /**
     * Registers a listener with multiple properties *without* an immediate callback with current values.
     * @param dependencies
     * @param callback function that takes values from the properties and returns nothing
     */
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP1<T1>, callback: (...params: [T1]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP2<T1, T2>, callback: (...params: [T1, T2]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP3<T1, T2, T3>, callback: (...params: [T1, T2, T3]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP4<T1, T2, T3, T4>, callback: (...params: [T1, T2, T3, T4]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP5<T1, T2, T3, T4, T5>, callback: (...params: [T1, T2, T3, T4, T5]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP6<T1, T2, T3, T4, T5, T6>, callback: (...params: [T1, T2, T3, T4, T5, T6]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP7<T1, T2, T3, T4, T5, T6, T7>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP8<T1, T2, T3, T4, T5, T6, T7, T8>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP9<T1, T2, T3, T4, T5, T6, T7, T8, T9>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    static lazyMultilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(dependencies: RP15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, callback: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]) => void): Multilink<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>;
    /**
     * Create a lazy Multilink from a dynamic or unknown number of dependencies.
     */
    static lazyMultilinkAny(dependencies: Readonly<TReadOnlyProperty<unknown>[]>, callback: () => void): UnknownMultilink;
    /**
     * Unlinks a listener that was added with multilink or lazyMultilink.
     */
    static unmultilink(multilink: UnknownMultilink): void;
}
export {};
//# sourceMappingURL=Multilink.d.ts.map