import '../../assert/js/assert.js';
import '../../tandem/js/PhetioIDUtils.js';
import '../../globals.js';
import IntentionalAny from '../../phet-core/js/types/IntentionalAny.js';
import IOType from '../../tandem/js/types/IOType.js';
import { Dependencies, RP1, RP10, RP11, RP12, RP13, RP14, RP15, RP2, RP3, RP4, RP5, RP6, RP7, RP8, RP9 } from './Multilink.js';
import { PropertyOptions } from './Property.js';
import ReadOnlyProperty from './ReadOnlyProperty.js';
import TReadOnlyProperty from './TReadOnlyProperty.js';
type SelfOptions = {
    phetioLinkDependencies?: boolean;
};
export type DerivedPropertyOptions<T> = SelfOptions & PropertyOptions<T>;
export type UnknownDerivedProperty<T> = DerivedProperty<T, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown>;
/**
 * T = type of the derived value
 * Parameters[] = types of the callback parameters, e.g. [ Vector2, number, boolean ]
 */
export default class DerivedProperty<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> extends ReadOnlyProperty<T> implements TReadOnlyProperty<T> {
    private dependencies;
    private readonly derivation;
    private readonly derivedPropertyListener;
    static DerivedPropertyIO: (parameterType: IOType) => IOType;
    /**
     * @param dependencies - Properties that this Property's value is derived from
     * @param derivation - function that derives this Property's value, expects args in the same order as dependencies
     * @param [providedOptions] - see Property
     */
    constructor(dependencies: RP1<T1>, derivation: (...params: [T1]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP2<T1, T2>, derivation: (...params: [T1, T2]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP3<T1, T2, T3>, derivation: (...params: [T1, T2, T3]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP4<T1, T2, T3, T4>, derivation: (...params: [T1, T2, T3, T4]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP5<T1, T2, T3, T4, T5>, derivation: (...params: [T1, T2, T3, T4, T5]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP6<T1, T2, T3, T4, T5, T6>, derivation: (...params: [T1, T2, T3, T4, T5, T6]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP7<T1, T2, T3, T4, T5, T6, T7>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP8<T1, T2, T3, T4, T5, T6, T7, T8>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP9<T1, T2, T3, T4, T5, T6, T7, T8, T9>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: RP15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]) => T, providedOptions?: DerivedPropertyOptions<T>);
    constructor(dependencies: Dependencies<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>, derivation: (...params: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15]) => T, providedOptions?: DerivedPropertyOptions<T>);
    /**
     * Determines whether this DerivedProperty has a specific dependency.
     */
    hasDependency(dependency: TReadOnlyProperty<IntentionalAny>): boolean;
    /**
     * Returns dependencies that are guaranteed to be defined internally.
     */
    private get definedDependencies();
    private getDerivedPropertyListener;
    /**
     * Allows forcing a recomputation (as a possible workaround to listener order). This works well if you have a
     * non-Property event that should trigger a value change for this Property.
     *
     * For example:
     * myEmitter.addListener( () => myDerivedProperty.recomputeDerivation() );
     * myObservableArray.addItemAddedListener( () => myDerivedProperty.recomputeDerivation() );
     */
    recomputeDerivation(): void;
    dispose(): void;
    /**
     * Support deferred DerivedProperty by only calculating the derivation once when it is time to undefer it and fire
     * notifications. This way we don't have intermediate derivation calls during PhET-iO state setting.
     */
    setDeferred(isDeferred: boolean): (() => void) | null;
    /**
     * Creates a derived boolean Property whose value is true iff firstProperty's value is equal to secondProperty's
     * value.
     */
    static valueEquals(firstProperty: TReadOnlyProperty<unknown>, secondProperty: TReadOnlyProperty<unknown>, options?: DerivedPropertyOptions<boolean>): TReadOnlyProperty<boolean>;
    static valueEqualsConstant(firstProperty: TReadOnlyProperty<unknown>, value: unknown, options?: DerivedPropertyOptions<boolean>): TReadOnlyProperty<boolean>;
    /**
     * Creates a derived boolean Property whose value is true iff every input Property value is true.
     */
    static and(properties: TReadOnlyProperty<boolean>[], options?: PropertyOptions<boolean>): UnknownDerivedProperty<boolean>;
    /**
     * Creates a derived boolean Property whose value is true iff any input Property value is true.
     */
    static or(properties: TReadOnlyProperty<boolean>[], options?: PropertyOptions<boolean>): UnknownDerivedProperty<boolean>;
    /**
     * Creates a derived number Property whose value is the result of multiplying all (number) dependencies together.
     */
    static multiply(properties: TReadOnlyProperty<number>[], options?: PropertyOptions<number>): UnknownDerivedProperty<number>;
    /**
     * Creates a derived number Property whose value is the result of adding all (number) dependencies together.
     */
    static add(properties: TReadOnlyProperty<number>[], options?: PropertyOptions<number>): UnknownDerivedProperty<number>;
    /**
     * Creates a derived boolean Property whose value is the inverse of the provided property.
     */
    static not(propertyToInvert: TReadOnlyProperty<boolean>, options?: DerivedPropertyOptions<boolean>): DerivedProperty<boolean, boolean, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown>;
    /**
     * Create a DerivedProperty from any number of dependencies.  This is parallel to Multilink.multilinkAny
     */
    static deriveAny<T>(dependencies: Array<TReadOnlyProperty<unknown>>, derivation: () => T, providedOptions?: DerivedPropertyOptions<T>): UnknownDerivedProperty<T>;
}
export declare class DerivedProperty1<T, T1> extends DerivedProperty<T, T1, never, never, never, never, never, never, never, never, never, never, never, never, never, never> {
}
export declare class DerivedProperty2<T, T1, T2> extends DerivedProperty<T, T1, T2, never, never, never, never, never, never, never, never, never, never, never, never, never> {
}
export declare class DerivedProperty3<T, T1, T2, T3> extends DerivedProperty<T, T1, T2, T3, never, never, never, never, never, never, never, never, never, never, never, never> {
}
export declare class DerivedProperty4<T, T1, T2, T3, T4> extends DerivedProperty<T, T1, T2, T3, T4, never, never, never, never, never, never, never, never, never, never, never> {
}
export declare class DerivedProperty5<T, T1, T2, T3, T4, T5> extends DerivedProperty<T, T1, T2, T3, T4, T5, never, never, never, never, never, never, never, never, never, never> {
}
export {};
//# sourceMappingURL=DerivedProperty.d.ts.map