import { EntityStateModel } from './models';
export declare namespace IdStrategy {
    abstract class IdGenerator<T> {
        protected readonly idKey: keyof T;
        protected constructor(idKey: keyof T);
        /**
         * Generates a completely new ID.
         * The IdGenerator's implementation has to ensure that the generated ID does not exist in the current state.
         * It can throw an UnableToGenerateIdError if it's unable to do so.
         * @param entity The entity to generate an ID for
         * @param state The current state
         * @see getPresentIdOrGenerate
         * @see UnableToGenerateIdError
         */
        abstract generateId(entity: Partial<T>, state: EntityStateModel<any>): string;
        /**
         * Checks if the given id is in the state's ID array
         * @param id the ID to check
         * @param state the current state
         */
        isIdInState(id: string, state: EntityStateModel<any>): boolean;
        /**
         * This function tries to get the present ID of the given entity with #getIdOf.
         * If it's undefined the #generateId function will be used.
         * @param entity The entity to get the ID from
         * @param state The current state
         * @see getIdOf
         * @see generateId
         */
        getPresentIdOrGenerate(entity: Partial<T>, state: EntityStateModel<any>): string;
        /**
         * A wrapper for #getIdOf. If the function returns undefined an error will be thrown.
         * @param entity The entity to get the ID from
         * @see getIdOf
         * @see InvalidIdOfError
         */
        mustGetIdOf(entity: any): string;
        /**
         * Returns the ID for the given entity. Can return undefined.
         * @param entity The entity to get the ID from
         */
        getIdOf(entity: any): string | undefined;
    }
    class IncrementingIdGenerator<T> extends IdGenerator<T> {
        constructor(idKey: keyof T);
        generateId(entity: Partial<T>, state: EntityStateModel<any>): string;
    }
    class UUIDGenerator<T> extends IdGenerator<T> {
        constructor(idKey: keyof T);
        generateId(entity: Partial<T>, state: EntityStateModel<any>): string;
        private uuidv4;
    }
    class EntityIdGenerator<T> extends IdGenerator<T> {
        constructor(idKey: keyof T);
        generateId(entity: Partial<T>, state: EntityStateModel<any>): string;
    }
}
