import type { FolderApi as Folder, FolderParams, BindingApi as Binding, BindingParams } from '@tweakpane/core';
export interface PRNGController<T = unknown> {
    seed: string;
    value: T;
    addGUI(gui: Folder, params?: BindingParams): Binding;
    getValue(): T;
    dispose(): void;
}
export interface PRNGGroupController<T = unknown> {
    seed: string;
    addGUI(gui: Folder, params?: Partial<FolderParams>): Folder;
    createController(index: number): PRNGController<T>;
    getValueAt(index: number): T;
    dispose(): void;
}
/**
 * Utility abstract class for generating pseudo-random values
 *
 * @class BasePRNGController
 * @implements PRNGController
 * @abstract
 */
declare abstract class BasePRNGController<T> implements PRNGController<T> {
    seed: string;
    abstract value: T;
    gui: Binding;
    constructor(seed: string);
    abstract addGUI(gui: Folder, params?: BindingParams): Binding;
    abstract getValue(): T;
    dispose(): void;
}
/**
 * Utility abstract class for managing multiple instances of individual controllers
 *
 * @class BasePRNGGroupController
 * @implements PRNGGroupController
 * @abstract
 */
declare abstract class BasePRNGGroupController<T> implements PRNGGroupController<T> {
    seed: string;
    controllers: PRNGController<T>[];
    gui: Folder;
    guiParams: BindingParams;
    constructor(seed: string);
    addGUI(gui: Folder, params?: Partial<FolderParams>): Folder;
    abstract createController(index: number): PRNGController<T>;
    getValueAt(index: number): T;
    dispose(): void;
    get title(): string;
}
/**
 * Utility class for generating pseudo-random boolean value
 *
 * @exports
 * @class BooleanController
 * @extends BasePRNGController
 */
export declare class BooleanController extends BasePRNGController<boolean> {
    value: boolean;
    probability: number;
    constructor(seed: string, probability?: number);
    addGUI(gui: Folder, params?: BindingParams): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): boolean;
}
/**
 * Utility class for generating pseudo-random sign value (-1 or 1)
 *
 * @exports
 * @class SignController
 * @extends BasePRNGController
 */
export declare class SignController extends BasePRNGController<number> {
    value: number;
    probability: number;
    constructor(seed: string, probability?: number);
    addGUI(gui: Folder, params?: Omit<BindingParams, 'options'>): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): number;
}
/**
 * Utility class for generating pseudo-random floating-point number within a specified range
 *
 * @exports
 * @class FloatController
 * @extends BasePRNGController
 */
export declare class FloatController extends BasePRNGController<number> {
    value: number;
    min: number;
    max: number;
    constructor(seed: string, min?: number, max?: number);
    addGUI(gui: Folder, { min, max, step, ...params }?: BindingParams): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): number;
}
/**
 * Utility class for generating pseudo-random integer number within a specified range
 *
 * @exports
 * @class IntController
 * @extends BasePRNGController
 */
export declare class IntController extends BasePRNGController<number> {
    value: number;
    min: number;
    max: number;
    constructor(seed: string, min: number, max: number);
    addGUI(gui: Folder, { min, max, step, ...params }?: BindingParams): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): number;
}
/**
 * Utility class for generating pseudo-random hexadecimal color
 *
 * @exports
 * @class HexColorController
 * @extends BasePRNGController
 */
export declare class HexColorController extends BasePRNGController<string> {
    value: string;
    constructor(seed: string);
    addGUI(gui: Folder, { view, ...params }?: BindingParams): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): string;
}
/**
 * Utility class for picking a pseudo-random item from a given array
 *
 * @exports
 * @class ItemController
 * @extends BasePRNGController
 */
export declare class ItemController<T = unknown> extends BasePRNGController<T> {
    value: T;
    items: T[];
    constructor(seed: string, items: T[]);
    addGUI(gui: Folder, params?: Omit<BindingParams, 'options'>): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): T;
}
/**
 * Utility class for picking a pseudo-random property value from a given object
 *
 * @exports
 * @class ObjectPropertyController
 * @extends BasePRNGController
 */
export declare class ObjectPropertyController<T = unknown> extends BasePRNGController<T> {
    value: T;
    object: Record<string, T>;
    constructor(seed: string, object: Record<string, T>);
    addGUI(gui: Folder, params?: Omit<BindingParams, 'options'>): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): T;
}
type WeightsItems<T> = Array<{
    weight: number;
    value: T;
}>;
/**
 * Utility class for selecting a pseudo-random index from an array of weighted items
 *
 * @exports
 * @class WeightsController
 * @extends BasePRNGController
 */
export declare class WeightsController<T = unknown> extends BasePRNGController<T> {
    value: T;
    items: WeightsItems<T>;
    weights: number[];
    constructor(seed: string, items: WeightsItems<T>);
    addGUI(gui: Folder, params?: Omit<BindingParams, 'options'>): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): T;
}
/**
 * Utility class for generating a pseudo-random number fitting a Gaussian (normal) distribution
 *
 * @exports
 * @class GaussianController
 * @extends BasePRNGController
 */
export declare class GaussianController extends BasePRNGController<number> {
    value: number;
    mean: number;
    spread: number;
    constructor(seed: string, mean?: number, spread?: number);
    addGUI(gui: Folder, { min, max, step, ...params }?: BindingParams): Binding<unknown, unknown, import("@tweakpane/core/dist/blade/binding/controller/binding.js").BindingController<unknown, import("@tweakpane/core").ValueController<unknown, import("@tweakpane/core").View, import("@tweakpane/core").Value<unknown>>, import("@tweakpane/core").BindingValue<unknown>>>;
    getValue(): number;
}
/**
 * Utility class for managing multiple `BooleanController`
 *
 * @exports
 * @class BooleanGroupController
 * @extends BasePRNGGroupController
 */
export declare class BooleanGroupController extends BasePRNGGroupController<boolean> {
    probability: number;
    controllers: BooleanController[];
    constructor(seed: string, probability: number);
    createController(index: number): BooleanController;
}
/**
 * Utility class for managing multiple `SignController`
 *
 * @exports
 * @class SignGroupController
 * @extends BasePRNGGroupController
 */
export declare class SignGroupController extends BasePRNGGroupController<number> {
    probability: number;
    controllers: SignController[];
    constructor(seed: string, probability: number);
    createController(index: number): SignController;
}
/**
 * Utility class for managing multiple `FloatController`
 *
 * @exports
 * @class FloatGroupController
 * @extends BasePRNGGroupController
 */
export declare class FloatGroupController extends BasePRNGGroupController<number> {
    min: number;
    max: number;
    controllers: FloatController[];
    constructor(seed: string, min: number, max: number);
    createController(index: number): FloatController;
}
/**
 * Utility class for managing multiple `IntController`
 *
 * @exports
 * @class IntGroupController
 * @extends BasePRNGGroupController
 */
export declare class IntGroupController extends BasePRNGGroupController<number> {
    min: number;
    max: number;
    controllers: IntController[];
    constructor(seed: string, min: number, max: number);
    createController(index: number): IntController;
}
/**
 * Utility class for managing multiple `HexColorController`
 *
 * @exports
 * @class HexColorGroupController
 * @extends BasePRNGGroupController
 */
export declare class HexColorGroupController extends BasePRNGGroupController<string> {
    controllers: HexColorController[];
    createController(index: number): HexColorController;
}
/**
 * Utility class for managing multiple `ItemController`
 *
 * @exports
 * @class ItemGroupController
 * @extends BasePRNGGroupController
 */
export declare class ItemGroupController<T = unknown> extends BasePRNGGroupController<T> {
    items: T[];
    controllers: ItemController<T>[];
    constructor(seed: string, items: T[]);
    createController(index: number): ItemController<T>;
}
/**
 * Utility class for managing multiple `ObjectPropertyController`
 *
 * @exports
 * @class ObjectPropertyGroupController
 * @extends BasePRNGGroupController
 */
export declare class ObjectPropertyGroupController<T = unknown> extends BasePRNGGroupController<T> {
    object: Record<string, T>;
    controllers: ObjectPropertyController<T>[];
    constructor(seed: string, object: Record<string, T>);
    createController(index: number): ObjectPropertyController<T>;
}
/**
 * Utility class for managing multiple `WeightsController`
 *
 * @exports
 * @class WeightsGroupController
 * @extends BasePRNGGroupController
 */
export declare class WeightsGroupController<T = unknown> extends BasePRNGGroupController<T> {
    items: WeightsItems<T>;
    controllers: WeightsController<T>[];
    constructor(seed: string, items: WeightsItems<T>);
    createController(index: number): WeightsController<T>;
}
/**
 * Utility class for managing multiple `GaussianController`
 *
 * @exports
 * @class GaussianGroupController
 * @extends BasePRNGGroupController
 */
export declare class GaussianGroupController extends BasePRNGGroupController<number> {
    controllers: GaussianController[];
    mean: number;
    spread: number;
    constructor(seed: string, mean?: number, spread?: number);
    createController(index: number): GaussianController;
}
export {};
