import '../../assert/js/assert.js';
import '../../globals.js';
/**
 * A numeric range.
 *
 * @author Chris Malley (PixelZoom, Inc.)
 * @author Andrew Adare
 * @author Chris Klusendorf (PhET Interactive Simulations)
 */
import IntentionalAny from '../../phet-core/js/types/IntentionalAny.js';
import IOType from '../../tandem/js/types/IOType.js';
import { StateObject } from '../../tandem/js/types/StateSchema.js';
export type TRange = {
    min: number;
    max: number;
};
declare const STATE_SCHEMA: {
    min: IOType<number, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject>;
    max: IOType<number, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject>;
};
export type RangeStateObject = StateObject<typeof STATE_SCHEMA>;
declare class Range implements TRange {
    private _min;
    private _max;
    /**
     * @param min - the minimum value of the range
     * @param max - the maximum value of the range
     */
    constructor(min: number, max: number);
    /**
     * Getter for min
     */
    getMin(): number;
    get min(): number;
    set min(min: number);
    /**
     * TODO: Allow chaining, https://github.com/phetsims/dot/issues/122
     * Setter for min
     */
    setMin(min: number): void;
    /**
     * Getter for max
     */
    getMax(): number;
    get max(): number;
    set max(max: number);
    /**
     * Setter for max
     */
    setMax(max: number): void;
    /**
     * Sets the minimum and maximum value of the range
     */
    setMinMax(min: number, max: number): this;
    /**
     * Sets the minimum and maximum value of this range from the provided Range.
     */
    set(range: Range): this;
    addValue(n: number): void;
    withValue(n: number): Range;
    /**
     * Makes a copy of this range
     */
    copy(): Range;
    /**
     * Gets the length of this range, that is the difference between the maximum and minimum value of this range
     */
    getLength(): number;
    /**
     * Gets the center of this range, that is the average value of the maximum and minimum value of this range
     */
    getCenter(): number;
    /**
     * Determines if this range contains the value
     */
    contains(value: number): boolean;
    /**
     * Does this range contain the specified range?
     */
    containsRange(range: Range): boolean;
    /**
     * Determine if this range overlaps (intersects) with another range
     */
    intersects(range: Range): boolean;
    /**
     * Do the two ranges overlap with one another?  Note that this assumes that
     * This is a open interval.
     */
    intersectsExclusive(range: Range): boolean;
    /**
     *
     * REVIEW: The naming is not helping me understand that this function is just the immutable version of includeRange().
     *
     * The smallest range that contains both this range and the input range, returned as a copy.
     *
     * The method below is the immutable form of the function includeRange(). The method will return a new range, and will not modify
     * this range.
     */
    union(range: Range): Range;
    /**
     * REVIEW: The naming is not helping me understand that this function is just the immutable version of constrainRange().
     *
     * The smallest range that is contained by both this range and the input range, returned as a copy.
     *
     * The method below the immutable form of the function constrainRange(). The method below will return a new range, and will not modify
     * this range.
     */
    intersection(range: Range): Range;
    /**
     * Modifies this range so that it contains both its original range and the input range.
     *
     * This is the mutable form of the function union(). This will mutate (change) this range, in addition to returning
     * this range itself.
     */
    includeRange(range: Range): Range;
    /**
     * Modifies this range so that it is the largest range contained both in its original range and in the input range.
     *
     * This is the mutable form of the function intersection(). This will mutate (change) this range, in addition to returning
     * this range itself.
     */
    constrainRange(range: Range): Range;
    /**
     * REVIEW: do we also need a mutable form of shifted?
     *
     * Returns a new range that is the same as this range, but shifted by the specified amount.
     */
    shifted(n: number): Range;
    /**
     * Converts the attributes of this range to a string
     */
    toString(): string;
    /**
     * Constrains a value to the range.
     */
    constrainValue(value: number): number;
    /**
     * Multiply the min and max by the provided value, immutable
     */
    times(value: number): Range;
    /**
     * Multiply the min and max by the provided value, mutable
     */
    multiply(value: number): this;
    /**
     * Determines if this Range is equal to some object.
     */
    equals(object: IntentionalAny): boolean;
    /**
     * Determines if this Range is approximately equal to some object.
     */
    equalsEpsilon(object: IntentionalAny, epsilon: number): boolean;
    /**
     * Given a value, normalize it to this Range's length, returning a value between 0 and 1 for values contained in
     * the Range. If the value is not contained in Range, then the return value will not be between 0 and 1.
     */
    getNormalizedValue(value: number): number;
    /**
     * Compute the opposite of a normalized value. Given a normalized value (between 0 and 1). Worked with any number
     * though, (even outside of the range). It is the client's responsibility to clamp if that is important to the
     * usage.
     */
    expandNormalizedValue(normalizedValue: number): number;
    /**
     * In https://github.com/phetsims/dot/issues/57, defaultValue was moved to RangeWithValue.
     * This ES5 getter catches programming errors where defaultValue is still used with Range.
     */
    get defaultValue(): number;
    toStateObject(): RangeStateObject;
    clampDelta(value: number, delta: number): number;
    static fromStateObject(stateObject: RangeStateObject): Range;
    static RangeIO: IOType<Range, StateObject<{
        min: IOType<number, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject>;
        max: IOType<number, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject>;
    }>, StateObject<{
        min: IOType<number, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject>;
        max: IOType<number, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject, import("../../tandem/js/types/InfiniteNumberIO.js").InfiniteNumberStateObject>;
    }>>;
    static readonly EVERYTHING: Range;
    static readonly NOTHING: Range;
}
export default Range;
//# sourceMappingURL=Range.d.ts.map