import { FException } from "../exception/f_exception.js";
export declare abstract class FDecimal {
    static readonly REGEXP: RegExp;
    private static _cfg;
    private static get cfg();
    private static get backend();
    static get settings(): FDecimalSettings;
    static configure(backend: FDecimalBackend): void;
    /**
     * Analog of Math​.abs()
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs
     */
    static abs(value: FDecimal): FDecimal;
    static add(left: FDecimal, right: FDecimal): FDecimal;
    static divide(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    static equals(left: FDecimal, right: FDecimal): boolean;
    static fromFloat(value: number, roundMode?: FDecimalRoundMode): FDecimal;
    static fromInt(value: number): FDecimal;
    static gt(left: FDecimal, right: FDecimal): boolean;
    static gte(left: FDecimal, right: FDecimal): boolean;
    static inverse(value: FDecimal): FDecimal;
    static isDecimal(test: any): test is FDecimal;
    static isNegative(test: FDecimal): boolean;
    static isPositive(test: FDecimal): boolean;
    static isZero(test: FDecimal): boolean;
    static lt(left: FDecimal, right: FDecimal): boolean;
    static lte(left: FDecimal, right: FDecimal): boolean;
    /**
     * Analog of Math.max()
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
     */
    static max(left: FDecimal, right: FDecimal): FDecimal;
    /**
     * Analog of Math.min()
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
     */
    static min(left: FDecimal, right: FDecimal): FDecimal;
    static mod(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    static multiply(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    static parse(value: string): FDecimal;
    static round(value: FDecimal, fractionDigits: FDecimalFractionDigits, roundMode?: FDecimalRoundMode): FDecimal;
    static subtract(left: FDecimal, right: FDecimal): FDecimal;
    abstract abs(): FDecimal;
    abstract add(value: FDecimal): FDecimal;
    abstract divide(value: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    abstract equals(value: FDecimal): boolean;
    abstract inverse(): FDecimal;
    abstract isNegative(): boolean;
    abstract isPositive(): boolean;
    abstract isZero(): boolean;
    abstract mod(value: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    abstract multiply(value: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    abstract round(fractionDigits: FDecimalFractionDigits, roundMode?: FDecimalRoundMode): FDecimal;
    abstract subtract(value: FDecimal): FDecimal;
    abstract toNumber(): number;
    abstract toString(): string;
    abstract toJSON(): string;
}
export type FDecimalFractionDigits = number;
export declare function isDecimalFraction(test: number): test is FDecimalFractionDigits;
export declare function verifyDecimalFraction(test: FDecimalFractionDigits): asserts test is FDecimalFractionDigits;
export declare enum FDecimalRoundMode {
    /**
     * Round to the smallest Financial greater than or equal to a given Financial.
     *
     * In other words: Round UP
     *
     * Example of Ceil to fraction:2
     * * 0.595 -> 0.60
     * * 0.555 -> 0.56
     * * 0.554 -> 0.56
     * * -0.595 -> -0.59
     * * -0.555 -> -0.55
     * * -0.554 -> -0.55
     */
    Ceil = "Ceil",
    /**
     * Round to the largest Financial less than or equal to a given Financial.
     *
     * In other words: Round DOWN
     *
     * Example of Floor to fraction:2
     * * 0.595 -> 0.59
     * * 0.555 -> 0.55
     * * 0.554 -> 0.55
     * * -0.595 -> -0.60
     * * -0.555 -> -0.56
     * * -0.554 -> -0.56
     */
    Floor = "Floor",
    /**
     * Round to the Financial rounded to the nearest Financial.
     *
     * In other words: Round classic
     *
     * Example of Round to fraction:2
     * * 0.595 -> 0.60
     * * 0.555 -> 0.56
     * * 0.554 -> 0.55
     * * -0.595 -> -0.60
     * * -0.555 -> -0.55
     * * -0.554 -> -0.55
     */
    Round = "Round",
    /**
     * Round to the Financial by removing fractional digits.
     *
     * Works same as Floor in positive range.
     *
     * Works same as Ceil in negative range
     *
     * Example of Trunc to fraction:2
     * * 0.595 -> 0.59
     * * 0.555 -> 0.55
     * * 0.554 -> 0.55
     * * -0.595 -> -0.59
     * * -0.555 -> -0.55
     * * -0.554 -> -0.55
     */
    Trunc = "Trunc"
}
export declare class FDecimalRoundModeUnreachableException extends FException {
    constructor(roundMode: never);
}
export interface FDecimalBackend {
    readonly settings: FDecimalSettings;
    /**
     * Analog of Math​.abs()
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs
     */
    abs(value: FDecimal): FDecimal;
    add(left: FDecimal, right: FDecimal): FDecimal;
    divide(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    equals(left: FDecimal, right: FDecimal): boolean;
    fromFloat(value: number, roundMode?: FDecimalRoundMode): FDecimal;
    fromInt(value: number): FDecimal;
    gt(left: FDecimal, right: FDecimal): boolean;
    gte(left: FDecimal, right: FDecimal): boolean;
    inverse(value: FDecimal): FDecimal;
    isDecimal(test: any): test is FDecimal;
    isNegative(test: FDecimal): boolean;
    isPositive(test: FDecimal): boolean;
    isZero(test: FDecimal): boolean;
    lt(left: FDecimal, right: FDecimal): boolean;
    lte(left: FDecimal, right: FDecimal): boolean;
    /**
     * Analog of Math.max()
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
     */
    max(left: FDecimal, right: FDecimal): FDecimal;
    /**
     * Analog of Math.min()
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
     */
    min(left: FDecimal, right: FDecimal): FDecimal;
    mod(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    multiply(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    parse(value: string): FDecimal;
    round(value: FDecimal, fractionDigits: FDecimalFractionDigits, roundMode?: FDecimalRoundMode): FDecimal;
    subtract(left: FDecimal, right: FDecimal): FDecimal;
    toNumber(value: FDecimal): number;
    toString(value: FDecimal): string;
}
export interface FDecimalSettings {
    readonly decimalSeparator: string;
    readonly fractionalDigits: number;
    readonly roundMode: FDecimalRoundMode;
}
export declare namespace FDecimal {
    /**
     * @deprecated Use FDecimalFraction instead
     */
    type FractionDigits = FDecimalFractionDigits;
    /**
     * @deprecated Use FDecimalFraction instead
     */
    namespace FractionDigits {
        /**
         * @deprecated Use isDecimalFraction instead
         */
        const isDecimalFractionDigits: (test: number) => test is FDecimalFractionDigits;
        /**
         * @deprecated Use verifyDecimalFraction instead
         */
        const verifyFraction: (test: FDecimalFractionDigits) => asserts test is FDecimalFractionDigits;
    }
    /**
     * @deprecated Use FDecimalBackend instead
     */
    type Backend = FDecimalBackend;
    /**
     * @deprecated Use FDecimalRoundMode instead
     */
    type RoundMode = FDecimalRoundMode;
    /**
     * Use FDecimalSettings instead
     */
    type Settings = FDecimalSettings;
    /**
     * @deprecated Use FDecimalRoundModeUnreachableException instead
     */
    type UnreachableRoundMode = FDecimalRoundModeUnreachableException;
}
export declare class FDecimalBase<TInstance, TBackend extends FDecimalBackend> implements FDecimal {
    private readonly _instance;
    private readonly _backend;
    constructor(instance: TInstance, backend: TBackend);
    get instance(): TInstance;
    abs(): FDecimal;
    add(value: FDecimal): FDecimal;
    divide(value: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    equals(value: FDecimal): boolean;
    inverse(): FDecimal;
    isNegative(): boolean;
    isPositive(): boolean;
    isZero(): boolean;
    mod(value: FDecimal): FDecimal;
    multiply(value: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    round(fractionDigits: FDecimalFractionDigits, roundMode?: FDecimalRoundMode): FDecimal;
    subtract(value: FDecimal): FDecimal;
    toNumber(): number;
    toString(): string;
    toJSON(): string;
    protected get backend(): TBackend;
}
export declare class FDecimalBackendNumber implements FDecimalBackend {
    private static verifyInstance;
    readonly settings: FDecimalSettings;
    /**
     *
     * @param roundMode Default value is FDecimalRoundMode.Round
     */
    constructor(fractionalDigits: number, roundMode: FDecimalRoundMode);
    abs(value: FDecimal): FDecimal;
    add(left: FDecimal, right: FDecimal): FDecimal;
    divide(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode | undefined): FDecimal;
    equals(left: FDecimal, right: FDecimal): boolean;
    fromFloat(value: number, _?: FDecimalRoundMode | undefined): FDecimal;
    fromInt(value: number): FDecimal;
    gt(left: FDecimal, right: FDecimal): boolean;
    gte(left: FDecimal, right: FDecimal): boolean;
    inverse(value: FDecimal): FDecimal;
    isDecimal(test: any): test is FDecimal;
    isNegative(test: FDecimal): boolean;
    isPositive(test: FDecimal): boolean;
    isZero(test: FDecimal): boolean;
    lt(left: FDecimal, right: FDecimal): boolean;
    lte(left: FDecimal, right: FDecimal): boolean;
    max(left: FDecimal, right: FDecimal): FDecimal;
    min(left: FDecimal, right: FDecimal): FDecimal;
    mod(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode): FDecimal;
    multiply(left: FDecimal, right: FDecimal, roundMode?: FDecimalRoundMode | undefined): FDecimal;
    parse(value: string): FDecimal;
    round(value: FDecimal, fractionDigits: number, roundMode?: FDecimalRoundMode | undefined): FDecimal;
    private _round;
    subtract(left: FDecimal, right: FDecimal): FDecimal;
    toNumber(value: FDecimal): number;
    toString(value: FDecimal): string;
}
