import GridData from './grid.js';
import { Color, Comparison, Direction, DirectionToggle, Instrument, Orientation, OrientationToggle, Position, Wrapping } from './primitives.js';
import { ControlLine } from './rules/musicControlLine.js';
export declare enum ConfigType {
    Boolean = "boolean",
    NullableBoolean = "nullableBoolean",
    Number = "number",
    NullableNumber = "nullableNumber",
    String = "string",
    Color = "color",
    Comparison = "comparison",
    Wrapping = "wrapping",
    Direction = "direction",
    DirectionToggle = "directionToggle",
    Orientation = "orientation",
    OrientationToggle = "orientationToggle",
    Tile = "tile",
    Shape = "shape",
    Grid = "grid",
    NullableGrid = "nullableGrid",
    Icon = "icon",
    ControlLines = "controlLines",
    NullableNote = "nullableNote",
    NullableInstrument = "nullableInstrument",
    SolvePath = "solvePath"
}
export interface Config<T> {
    readonly type: ConfigType;
    readonly field: string;
    readonly description: string;
    readonly explanation?: string;
    readonly default: T;
    readonly configurable: boolean;
}
export interface BooleanConfig extends Config<boolean> {
    readonly type: ConfigType.Boolean;
}
export interface NullableBooleanConfig extends Config<boolean | null> {
    readonly type: ConfigType.NullableBoolean;
}
export interface NumberConfig extends Config<number> {
    readonly type: ConfigType.Number;
    readonly min?: number;
    readonly max?: number;
    readonly step?: number;
}
export interface NullableNumberConfig extends Config<number | null> {
    readonly type: ConfigType.NullableNumber;
    readonly min?: number;
    readonly max?: number;
    readonly step?: number;
}
export interface StringConfig extends Config<string> {
    readonly type: ConfigType.String;
    readonly maxLength?: number;
    readonly placeholder?: string;
}
export interface ColorConfig extends Config<Color> {
    readonly type: ConfigType.Color;
    readonly allowGray: boolean;
}
export interface ComparisonConfig extends Config<Comparison> {
    readonly type: ConfigType.Comparison;
}
export interface WrappingConfig extends Config<Wrapping> {
    readonly type: ConfigType.Wrapping;
}
export interface DirectionConfig extends Config<Direction> {
    readonly type: ConfigType.Direction;
}
export interface DirectionToggleConfig extends Config<DirectionToggle> {
    readonly type: ConfigType.DirectionToggle;
}
export interface OrientationConfig extends Config<Orientation> {
    readonly type: ConfigType.Orientation;
}
export interface OrientationToggleConfig extends Config<OrientationToggle> {
    readonly type: ConfigType.OrientationToggle;
}
export interface TileConfig extends Config<GridData> {
    readonly type: ConfigType.Tile;
    readonly resizable: boolean;
}
export interface ShapeConfig extends Config<GridData> {
    readonly type: ConfigType.Shape;
    readonly resizable: boolean;
}
export interface GridConfig extends Config<GridData> {
    readonly type: ConfigType.Grid;
}
export interface NullableGridConfig extends Config<GridData | null> {
    readonly type: ConfigType.NullableGrid;
    readonly nonNullDefault: GridData;
}
export interface IconConfig extends Config<string> {
    readonly type: ConfigType.Icon;
}
export interface ControlLinesConfig extends Config<ControlLine[]> {
    readonly type: ConfigType.ControlLines;
}
export interface NullableNoteConfig extends Config<string | null> {
    readonly type: ConfigType.NullableNote;
}
export interface NullableInstrumentConfig extends Config<Instrument | null> {
    readonly type: ConfigType.NullableInstrument;
}
export interface SolvePathConfig extends Config<Position[]> {
    readonly type: ConfigType.SolvePath;
}
export type AnyConfig = BooleanConfig | NullableBooleanConfig | NumberConfig | NullableNumberConfig | StringConfig | ColorConfig | ComparisonConfig | WrappingConfig | DirectionConfig | DirectionToggleConfig | OrientationConfig | OrientationToggleConfig | TileConfig | ShapeConfig | GridConfig | NullableGridConfig | IconConfig | ControlLinesConfig | NullableNoteConfig | NullableInstrumentConfig | SolvePathConfig;
/**
 * Compare two config values for equality, using an appropriate method for the config type.
 *
 * @param type The type of the config.
 * @param a The first value to compare.
 * @param b The second value to compare.
 * @returns Whether the two values are equal.
 */
export declare function configEquals<C extends AnyConfig>(type: C['type'], a: C['default'], b: C['default']): boolean;
