import type { Prettify } from './mapping.js';
/**
 * enum type representation
 *
 * ```ts
 * enum MyEnum { a, b }
 *
 * function doMagic(enum: Enumerable): void { ... }
 *
 * doMagic(MyEnum)
 * ```
 *
 * @export
 * @since 1.0.0
 */
export type Enumerable = {
    [id: string]: number | string;
    [nu: number]: string;
};
/**
 * enum values type
 *
 * ```
 * enum MyEnum { a, b }
 * EnumerableValue<typeof MyEnum> => MyEnum.a | MyEnum.b
 * ```
 *
 * @export
 * @template {Enumerable} TEnum
 * @since 1.1.5
 */
export type EnumerableValue<TEnum extends Enumerable> = Prettify<TEnum[keyof TEnum]>;
/**
 * enum values base type
 *
 * ```
 * String Enum => string
 * Numeric Enum => number
 * Heterogeneous Enum => string | number
 * ```
 *
 * @export
 * @template {EnumerableValue<Enumerable>} TEnumValue
 * @since 1.1.5
 */
export type EnumerableBase<TEnumValue extends EnumerableValue<Enumerable>> = TEnumValue extends string ? TEnumValue extends number ? string | number : string : TEnumValue extends number ? number : never;
/**
 * tuple of enum key and associated value
 *
 * @export
 * @template {Enumerable} E
 * @since 1.2.0
 */
export type EnumerableEntry<E extends Enumerable> = {
    [key in keyof E]: [key, E[key]];
} extends Record<PropertyKey, infer P> ? Exclude<P, [number, string]> : never;
/**
 * Gain keys and values from enum instances. Works with string, numeric and mixed enums
 * (properly ignoring the numeric index reverse lookup entries for numeric enums)
 *
 * @export
 * @class EnumerableObject
 * @since 1.2.0
 */
export declare class EnumerableObject {
    /**
     * Gain enum values (equivalent to Object.values(...))
     *
     * @public
     * @template {Enumerable} E
     * @param {E} enum_
     * @returns {ReadonlyArray<EnumerableValue<E>>}
     * @since 1.2.0
     */
    values<E extends Enumerable>(enum_: E): ReadonlyArray<EnumerableValue<E>>;
    /**
     * Gain enum keys (equivalent to Object.keys(...))
     *
     * @public
     * @template {Enumerable} E
     * @param {E} enum_
     * @returns {ReadonlyArray<keyof E>}
     * @since 1.2.0
     */
    keys<E extends Enumerable>(enum_: E): ReadonlyArray<keyof E>;
    /**
     * Gain enum entries (equivalent to Object.entries(...))
     *
     * @public
     * @template {Enumerable} E
     * @param {E} enum_
     * @returns {ReadonlyArray<EnumerableEntry<E>>}
     * @since 1.2.0
     */
    entries<E extends Enumerable>(enum_: E): ReadonlyArray<EnumerableEntry<E>>;
    private disassemble;
}
