export type Enum<E> = ({
    [value: number]: keyof E;
} & {
    [key: string]: E;
}) | Object;
/**
 * for the sake of implicit any in object index
 * */
export declare function enum_i2s<E>(e: E, i: keyof E): E[keyof E];
export declare function enum_s2i<E>(e: E, s: E[keyof E]): keyof E;
export declare function enum_next_i<E>(e: E, i: number & keyof E): keyof E;
export declare function enum_next_s<E>(e: E, s: E[keyof E]): E[keyof E];
export declare function enum_keys<E>(e: Enum<E>): Array<string & keyof E>;
/**
 * numeric values
 * */
export declare function enum_indices<E>(e: Enum<E>): Array<keyof E>;
/**
 * numeric or string values
 * if    original enum -> numeric values;
 *    stringified enum -> string values
 * */
export declare function enum_values<E>(e: Enum<E>): E[];
export declare function enum_last_i<E>(e: Enum<E>): E & number;
export declare function enum_last_s<E>(e: Enum<E>): keyof E & string;
export declare function enum_is_last_i<E>(e: Enum<E>, i: E): boolean;
export declare function enum_is_last_s<E>(e: Enum<E>, s: keyof E): boolean;
export declare function enum_is_last<E>(e: Enum<E>, v: E | number | keyof E | string): boolean;
export declare function enum_is_in_range<E extends object>(e: E, v: E[keyof E] | keyof E): boolean;
export declare function enum_not_equals<E1, E2>(e1: E1, e2: E2): boolean;
/**
 * inplace update
 *
 * @return original (modified) enum
 * */
export declare function enum_set_string<E extends object>(e: E): E;
/**
 * inplace update
 * */
export declare function enum_only_string<E extends object>(e: E): E;
