import { type Seed } from 'toosoon-prng';
import type { WeightedItems } from './types';
/**
 * Utility abstract class for generating a pseudo-random values
 *
 * @class PRNGController
 * @abstract
 * @template {unknown} [T=unknown]
 */
export declare abstract class PRNGController<T = unknown> {
    /**
     * Seed string used for pseudo-random generations
     */
    seed: string;
    /**
     * Pseudo-random value generated by this controller
     */
    abstract value: T;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     */
    constructor(seed: Seed);
    /**
     * Generate this controller pseudo-random value
     *
     * @returns {T} Generated pseudo-random value
     */
    abstract getValue(): T;
    /**
     * Dispose this controller
     */
    dispose(): void;
}
/**
 * Utility abstract class for managing multiple instances of controllers
 *
 * @class PRNGGroupController
 * @abstract
 * @template {unknown} [T=unknown]
 * @template {PRNGController<T>} [C=PRNGController<T>]
 */
export declare abstract class PRNGGroupController<T = unknown, C extends PRNGController<T> = PRNGController<T>> {
    /**
     * Seed string used for pseudo-random generations
     */
    seed: string;
    /**
     * Controllers managed by this group
     */
    controllers: C[];
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     */
    constructor(seed: Seed);
    /**
     * Create a new controller
     *
     * @param {number} index Index of the controller to create
     * @returns {C} Created controller
     */
    abstract createController(index: number): C;
    /**
     * Generate a pseudo-random value
     *
     * @param {number} index Index of the controller to use
     * @returns {T} Generated pseudo-random value
     */
    getValueAt(index: number): T;
    /**
     * Dispose this group controllers
     */
    dispose(): void;
}
/**
 * Utility class for generating pseudo-random boolean values
 *
 * @exports
 * @class BooleanController
 * @extends PRNGController
 */
export declare class BooleanController extends PRNGController<boolean> {
    /**
     * Pseudo-random boolean value generated by this controller
     */
    value: boolean;
    /**
     * Probability to get `true`
     */
    probability: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [probability=0.5] Probability to get `true`
     */
    constructor(seed: Seed, probability?: number);
    getValue(): boolean;
}
/**
 * Utility class for generating pseudo-random sign values (-1 or 1)
 *
 * @exports
 * @class SignController
 * @extends PRNGController
 */
export declare class SignController extends PRNGController<number> {
    /**
     * Pseudo-random sign value generated by this controller
     */
    value: number;
    /**
     * Probability to get `1`
     */
    probability: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [probability=0.5] Probability to get `1`
     */
    constructor(seed: Seed, probability?: number);
    getValue(): number;
}
/**
 * Utility class for generating pseudo-random floating-point numbers within a specified range
 *
 * @exports
 * @class FloatController
 * @extends PRNGController
 */
export declare class FloatController extends PRNGController<number> {
    /**
     * Pseudo-random floating-point number value generated by this controller
     */
    value: number;
    /**
     * Minimum boundary
     */
    min: number;
    /**
     * Maximum boundary
     */
    max: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [min=0] Minimum boundary
     * @param {number} [max=1] Maximum boundary
     */
    constructor(seed: Seed, min?: number, max?: number);
    getValue(): number;
}
/**
 * Utility class for generating pseudo-random integer numbers within a specified range
 *
 * @exports
 * @class IntController
 * @extends PRNGController
 */
export declare class IntController extends PRNGController<number> {
    /**
     * Pseudo-random integer number value generated by this controller
     */
    value: number;
    /**
     * Minimum boundary
     */
    min: number;
    /**
     * Maximum boundary
     */
    max: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} min Minimum boundary
     * @param {number} max Maximum boundary
     */
    constructor(seed: Seed, min: number, max: number);
    getValue(): number;
}
/**
 * Utility class for generating pseudo-random hexadecimal colors
 *
 * @exports
 * @class HexColorController
 * @extends PRNGController
 */
export declare class HexColorController extends PRNGController<string> {
    /**
     * Pseudo-random hexadecimal color value generated by this controller
     */
    value: string;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     */
    constructor(seed: Seed);
    getValue(): string;
}
/**
 * Utility class for pseudo-randomly picking an item from an array
 *
 * @exports
 * @class ItemController
 * @extends PRNGController<T>
 * @template {unknown} [T=unknown]
 */
export declare class ItemController<T = unknown> extends PRNGController<T> {
    /**
     * Item pseudo-randomly picked from the items array
     */
    value: T;
    /**
     * Array of items to pseudo-randomly pick from
     */
    items: T[];
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {T[]} items Array of items to pseudo-randomly pick from
     */
    constructor(seed: Seed, items: T[]);
    getValue(): T;
}
/**
 * Utility class for pseudo-randomly picking a property value from an object
 *
 * @exports
 * @class ObjectPropertyController
 * @extends PRNGController<T|undefined>
 * @template {unknown} [T=unknown]
 */
export declare class ObjectPropertyController<T = unknown> extends PRNGController<T | undefined> {
    /**
     * Property value pseudo-randomly picked from the object
     */
    value: T | undefined;
    /**
     * Object to pseudo-randomly pick the property value from
     */
    object: Record<string, T>;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {object} object Object to pseudo-randomly pick the property value from
     */
    constructor(seed: Seed, object: Record<string, T>);
    getValue(): T | undefined;
}
/**
 * Utility class for pseudo-randomly picking an item from an array of weighted items
 *
 * @exports
 * @class WeightsController
 * @extends PRNGController
 */
export declare class WeightsController<T = unknown> extends PRNGController<T> {
    /**
     * Item pseudo-randomly picked from the weighted items array
     */
    value: T;
    /**
     * Array of weighted items to pseudo-randomly pick from
     */
    items: WeightedItems<T>;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {WeightedItems<T>} items Array of weighted items to pseudo-randomly pick from
     */
    constructor(seed: Seed, items: WeightedItems<T>);
    getValue(): T;
    /**
     * Array of weights
     */
    get weights(): number[];
}
/**
 * Utility class for generating pseudo-random numbers fitting a Gaussian (normal) distribution
 *
 * @exports
 * @class GaussianController
 * @extends PRNGController
 */
export declare class GaussianController extends PRNGController<number> {
    /**
     * Pseudo-random number value generated by this controller
     */
    value: number;
    /**
     * Mean (central) value of the distribution
     */
    mean: number;
    /**
     * Spread (standard deviation) of the distribution
     */
    spread: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [mean=0] Mean (central) value of the distribution
     * @param {number} [spread=1] Spread (standard deviation) of the distribution
     */
    constructor(seed: Seed, mean?: number, spread?: number);
    getValue(): number;
}
/**
 * Utility class for managing multiple {@link BooleanController}
 *
 * @exports
 * @class BooleanGroupController
 * @extends PRNGGroupController<boolean, BooleanController>
 */
export declare class BooleanGroupController extends PRNGGroupController<boolean, BooleanController> {
    /**
     * Probability to get `true`
     */
    probability: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [probability=0.5] Probability to get `true`
     */
    constructor(seed: Seed, probability?: number);
    createController(index: number): BooleanController;
}
/**
 * Utility class for managing multiple {@link SignController}
 *
 * @exports
 * @class SignGroupController
 * @extends PRNGGroupController<number, SignController>
 */
export declare class SignGroupController extends PRNGGroupController<number, SignController> {
    /**
     * Probability to get `1`
     */
    probability: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [probability=0.5] Probability to get `1`
     */
    constructor(seed: Seed, probability?: number);
    createController(index: number): SignController;
}
/**
 * Utility class for managing multiple {@link FloatController}
 *
 * @exports
 * @class FloatGroupController
 * @extends PRNGGroupController<number, FloatController>
 */
export declare class FloatGroupController extends PRNGGroupController<number, FloatController> {
    /**
     * Minimum boundary
     */
    min: number;
    /**
     * Maximum boundary
     */
    max: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [min=0] Minimum boundary
     * @param {number} [max=1] Maximum boundary
     */
    constructor(seed: Seed, min?: number, max?: number);
    createController(index: number): FloatController;
}
/**
 * Utility class for managing multiple {@link IntController}
 *
 * @exports
 * @class IntGroupController
 * @extends PRNGGroupController<number, IntController>
 */
export declare class IntGroupController extends PRNGGroupController<number, IntController> {
    /**
     * Minimum boundary
     */
    min: number;
    /**
     * Maximum boundary
     */
    max: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} min Minimum boundary
     * @param {number} max Maximum boundary
     */
    constructor(seed: Seed, min: number, max: number);
    createController(index: number): IntController;
}
/**
 * Utility class for managing multiple {@link HexColorController}
 *
 * @exports
 * @class HexColorGroupController
 * @extends PRNGGroupController<string, HexColorController>
 */
export declare class HexColorGroupController extends PRNGGroupController<string, HexColorController> {
    createController(index: number): HexColorController;
}
/**
 * Utility class for managing multiple {@link ItemController}
 *
 * @exports
 * @class ItemGroupController
 * @extends PRNGGroupController<T, ItemController<T>>
 * @template {unknown} [T=unknown]
 */
export declare class ItemGroupController<T = unknown> extends PRNGGroupController<T, ItemController<T>> {
    /**
     * Array of items to pseudo-randomly pick from
     */
    items: T[];
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {T[]} items Array of items to pseudo-randomly pick from
     */
    constructor(seed: Seed, items: T[]);
    createController(index: number): ItemController<T>;
}
/**
 * Utility class for managing multiple {@link ObjectPropertyController}
 *
 * @exports
 * @class ObjectPropertyGroupController
 * @extends PRNGGroupController<T|undefined, ObjectPropertyController<T>>
 * @template {unknown} [T=unknown]
 */
export declare class ObjectPropertyGroupController<T = unknown> extends PRNGGroupController<T | undefined, ObjectPropertyController<T>> {
    /**
     * Object to pseudo-randomly pick the property value from
     */
    object: Record<string, T>;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {object} object Object to pseudo-randomly pick the property value from
     */
    constructor(seed: Seed, object: Record<string, T>);
    createController(index: number): ObjectPropertyController<T>;
}
/**
 * Utility class for managing multiple {@link WeightsController}
 *
 * @exports
 * @class WeightsGroupController
 * @extends PRNGGroupController<T, WeightsController<T>>
 * @template {unknown} [T=unknown]
 */
export declare class WeightsGroupController<T = unknown> extends PRNGGroupController<T, WeightsController<T>> {
    /**
     * Array of weighted items to pseudo-randomly pick from
     */
    items: WeightedItems<T>;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {WeightedItems<T>} items Array of weighted items to pseudo-randomly pick from
     */
    constructor(seed: Seed, items: WeightedItems<T>);
    createController(index: number): WeightsController<T>;
    /**
     * Array of weights
     */
    get weights(): number[];
}
/**
 * Utility class for managing multiple {@link GaussianController}
 *
 * @exports
 * @class GaussianGroupController
 * @extends PRNGGroupController<number, GaussianController>
 */
export declare class GaussianGroupController extends PRNGGroupController<number, GaussianController> {
    /**
     * Mean (central) value of the distribution
     */
    mean: number;
    /**
     * Spread (standard deviation) of the distribution
     */
    spread: number;
    /**
     * @param {Seed} seed Seed string used for pseudo-random generations
     * @param {number} [mean=0] Mean (central) value of the distribution
     * @param {number} [spread=1] Spread (standard deviation) of the distribution
     */
    constructor(seed: Seed, mean?: number, spread?: number);
    createController(index: number): GaussianController;
}
