import type { NumberRange } from "./number-range.js";
import type { Rebound } from "./rebound.js";
import type { BoundedNumber, BoundsConfig, IntegerSet, LowerExclusive, LowerInclusive, LowerInEx, LowerInExFrom, NegInfinity, NumberSet, NumberSetFrom, PosInfinity, RealSet, UpperExclusive, UpperInclusive, UpperInEx, UpperInExFrom } from "./spec.js";
type IsCompleteConfig<LowerInc extends LowerInEx, Lower extends number, Int extends NumberSet, Upper extends number, UpperInc extends UpperInEx> = number extends Lower ? false : number extends Upper ? false : NumberSet extends Int ? false : LowerInEx extends LowerInc ? false : UpperInEx extends UpperInc ? false : true;
export type ReboundConfigBuilder<LowerInc extends LowerInEx, Lower extends number, Int extends NumberSet, Upper extends number, UpperInc extends UpperInEx> = {
    readonly config: BoundsConfig<LowerInc, Lower, Int, Upper, UpperInc>;
} & IsCompleteConfig<LowerInc, Lower, Int, Upper, UpperInc> extends true ? {
    build(): Rebound<BoundedNumber<BoundsConfig<LowerInc, Lower, Int, Upper, UpperInc>>>;
} : ((number extends Lower ? {
    fromExclusive<L extends number>(value: L): ReboundConfigBuilder<LowerExclusive, L, Int, Upper, UpperInc>;
    fromInclusive<L extends number>(value: L): ReboundConfigBuilder<LowerInclusive, L, Int, Upper, UpperInc>;
    fromNegInfinity(): ReboundConfigBuilder<LowerInExFrom<true>, NegInfinity, Int, Upper, UpperInc>;
    fromValue<L extends number, LI extends boolean>(value: L, inclusive: LI): ReboundConfigBuilder<LowerInExFrom<LI>, L, Int, Upper, UpperInc>;
} : object) & (NumberSet extends Int ? {
    intOnly<IR extends boolean>(int: IR): ReboundConfigBuilder<LowerInc, Lower, NumberSetFrom<IR>, Upper, UpperInc>;
    integers(): ReboundConfigBuilder<LowerInc, Lower, IntegerSet, Upper, UpperInc>;
    reals(): ReboundConfigBuilder<LowerInc, Lower, RealSet, Upper, UpperInc>;
} : object) & (number extends Upper ? {
    toExclusive<U extends number>(value: U): ReboundConfigBuilder<LowerInc, Lower, Int, U, UpperExclusive>;
    toInclusive<U extends number>(value: U): ReboundConfigBuilder<LowerInc, Lower, Int, U, UpperInclusive>;
    toPosInfinity(): ReboundConfigBuilder<LowerInc, Lower, Int, PosInfinity, UpperInExFrom<true>>;
    toValue<U extends number, UI extends boolean>(value: U, inclusive: UI): ReboundConfigBuilder<LowerInc, Lower, Int, U, UpperInExFrom<UI>>;
} : object));
export declare function checkMissing<Lower extends number, LowerInc extends LowerInEx, Int extends NumberSet, UpperInc extends UpperInEx, Upper extends number>(config: Partial<BoundsConfig<LowerInEx, number, NumberSet, number, UpperInEx>>): asserts config is BoundsConfig<LowerInc, Lower, Int, Upper, UpperInc>;
export declare class ReboundBuilder<LowerInc extends LowerInEx, Lower extends number, Int extends NumberSet, Upper extends number, UpperInc extends UpperInEx> {
    private readonly config;
    private readonly toRebound;
    constructor(config: BoundsConfig<LowerInc, Lower, Int, Upper, UpperInc>, toRebound: <Config extends BoundsConfig<LowerInc, Lower, Int, Upper, UpperInc>>(config: Config, range: NumberRange) => Rebound<BoundedNumber<Config>>);
    build(): Rebound<BoundedNumber<typeof this.config>>;
    fromExclusive<L extends number>(value: L): ReboundConfigBuilder<LowerExclusive, L, Int, Upper, UpperInc>;
    fromInclusive<L extends number>(value: L): ReboundConfigBuilder<LowerInclusive, L, Int, Upper, UpperInc>;
    fromNegInfinity(): ReboundConfigBuilder<LowerInExFrom<true>, NegInfinity, Int, Upper, UpperInc>;
    fromValue<L extends number, LI extends boolean>(lower: L, inclusive: LI): ReboundConfigBuilder<LowerInExFrom<LI>, L, Int, Upper, UpperInc>;
    intOnly<IR extends boolean>(intOnly: IR): ReboundConfigBuilder<LowerInc, Lower, NumberSetFrom<IR>, Upper, UpperInc>;
    integers(): ReboundConfigBuilder<LowerInc, Lower, IntegerSet, Upper, UpperInc>;
    reals(): ReboundConfigBuilder<LowerInc, Lower, RealSet, Upper, UpperInc>;
    protected setIntReal<IR extends NumberSet>(int: IR): asserts this is ReboundConfigBuilder<LowerInc, Lower, IR, Upper, UpperInc>;
    protected setLower<L extends number, LI extends LowerInEx>(lower: L, lowerInc: LI): asserts this is ReboundConfigBuilder<LI, L, Int, Upper, UpperInc>;
    protected setUpper<U extends number, UI extends UpperInEx>(upper: U, upperInc: UI): asserts this is ReboundConfigBuilder<LowerInc, Lower, Int, U, UI>;
    toExclusive<U extends number>(value: U): ReboundConfigBuilder<LowerInc, Lower, Int, U, UpperExclusive>;
    toInclusive<U extends number>(value: U): ReboundConfigBuilder<LowerInc, Lower, Int, U, UpperInclusive>;
    toPosInfinity(): ReboundConfigBuilder<LowerInc, Lower, Int, PosInfinity, UpperInExFrom<true>>;
    toValue<U extends number, UI extends boolean>(value: U, inclusive: UI): ReboundConfigBuilder<LowerInc, Lower, Int, U, UpperInExFrom<UI>>;
}
export {};
//# sourceMappingURL=rebound-builder.d.ts.map