/**
 * 字符串类型的别名，防止和其他字面量类型联合时被过度简化。
 * 例如：避免 `'utf-8' | string` 被化简成 `string`
 */
export type Str = string & Record<never, never>;
declare abstract class Granularity<T extends string = string> {
    abstract readonly list: readonly T[];
    abstract readonly map: Readonly<Map<T, number>>;
    readonly has: (v: string) => v is T;
    readonly idx: {
        (v: T): number;
        (...v: T[]): number[];
    };
    private readonly _fromIdx;
    readonly fromIdx: {
        (idx: number): T;
        (...indexes: number[]): T[];
    };
    readonly cp: (a: T, b: T) => number;
    readonly lt: (a: T, b: T) => boolean;
    readonly lte: (a: T, b: T) => boolean;
    readonly gt: (a: T, b: T) => boolean;
    readonly gte: (a: T, b: T) => boolean;
    readonly minmax: (v1: T, v2: T) => [T, T];
    readonly minmaxIdx: (v1: T, v2: T) => [number, number];
    readonly min: (...args: T[]) => T;
    readonly max: (...args: T[]) => T;
    readonly clamp: (min: T, val: T | Str, max: T, rule?: "min" | "max") => T;
}
declare class _DateGranularity extends Granularity<'year' | 'month' | 'day'> {
    readonly year = "year";
    readonly month = "month";
    readonly day = "day";
    readonly list: readonly ["day", "month", "year"];
    readonly map: Map<"month" | "year" | "day", number>;
}
type DateGran = _DateGranularity['list'][number];
export declare const dateGranHelper: _DateGranularity;
declare class _TimeGranularity extends Granularity<'hour' | 'minute' | 'second' | 'millisecond'> {
    readonly hour = "hour";
    readonly minute = "minute";
    readonly second = "second";
    readonly millisecond = "millisecond";
    readonly list: readonly ["millisecond", "second", "minute", "hour"];
    readonly map: Map<"hour" | "minute" | "second" | "millisecond", number>;
}
type TimeGran = _TimeGranularity['list'][number];
export declare const timeGranHelper: _TimeGranularity;
declare class _DateTimeGranularity extends Granularity<DateGran | TimeGran> {
    readonly year = "year";
    readonly month = "month";
    readonly day = "day";
    readonly hour = "hour";
    readonly minute = "minute";
    readonly second = "second";
    readonly millisecond = "millisecond";
    readonly list: readonly ["millisecond", "second", "minute", "hour", "day", "month", "year"];
    readonly map: Map<"month" | "year" | "day" | "hour" | "minute" | "second" | "millisecond", number>;
    readonly toTimeGran: (gran: DateGran | TimeGran) => TimeGran;
    readonly toDateGran: (gran: DateGran | TimeGran) => DateGran;
    readonly isTimeGran: (gran: DateGran | TimeGran | Str) => gran is TimeGran;
    readonly isDateGran: (gran: DateGran | TimeGran | Str) => gran is DateGran;
}
type DateTimeGran = _DateTimeGranularity['list'][number];
export declare const dateTimeGranHelper: _DateTimeGranularity;
export declare const granHelper: {
    readonly date: _DateGranularity;
    readonly time: _TimeGranularity;
    readonly dateTime: _DateTimeGranularity;
    readonly toDateGran: (gran: DateGran | TimeGran) => DateGran;
    readonly toTimeGran: (gran: DateGran | TimeGran) => TimeGran;
    readonly isTimeGran: (gran: DateGran | TimeGran | Str) => gran is TimeGran;
    readonly isDateGran: (gran: DateGran | TimeGran | Str) => gran is DateGran;
};
export type { DateGran as DateGranularity, TimeGran as TimeGranularity, DateTimeGran as DateTimeGranularity };
