import React, { ReactNode, FC, ComponentType } from 'react';
export type RegistryContext = Record<string, Registry>;
export declare const registryContext: React.Context<RegistryContext>;
export declare function withRegistry(...registries: Registry[]): <P>(Component: ComponentType<P>) => FC<P>;
export interface IRegistryConsumerProps {
    id: string;
    children: (registry: any) => ReactNode;
}
export declare const RegistryConsumer: FC<IRegistryConsumerProps>;
/**
 * @deprecated consider using 'RegistryConsumer' instead
 */
export declare const ComponentRegistryConsumer: React.FC<IRegistryConsumerProps>;
export declare const useRegistries: () => RegistryContext;
export declare const useRegistry: <T extends {}>(id: string) => T;
/**
 * @deprecated consider using 'useRegistry' instead
 */
export declare const useComponentRegistry: <T extends {}>(id: string) => T;
export interface IRegistryOptions {
    id: string;
    overridable?: boolean;
}
declare const registryOverloadMark = "RegistryOverloadHMark";
type SimpleOverload<T> = (Base: T) => T;
interface IRegistryEntityOverload<T> {
    $symbol: typeof registryOverloadMark;
    overload: SimpleOverload<T>;
}
type IRegistryEntity<T = any> = T | IRegistryEntityOverload<T>;
export type IRegistryEntities = Record<string, IRegistryEntity>;
export declare class Registry {
    id: string;
    overridable: boolean;
    private entities;
    constructor({ id, overridable }: IRegistryOptions);
    /**
     * Set registry entry by id.
     *
     * @param id entry id
     * @param entity valid registry entity
     */
    set<T>(id: string, entity: T): this;
    /**
     * Set extender for registry entry by id.
     *
     * @param id entry id
     * @param overload valid registry entity extender
     */
    extends<T>(id: string, overload: SimpleOverload<T>): this;
    /**
     * Set react entities in registry via object literal.
     *
     * @param entitiesSet set of valid registry entities
     */
    fill(entitiesSet: IRegistryEntities): this;
    /**
     * Get entry from registry by id.
     *
     * @param id entry id
     */
    get<T>(id: string): IRegistryEntity<T>;
    /**
     * Returns raw entities from registry.
     */
    snapshot<RT>(): RT;
    /**
     * Override entities by external registry.
     * @internal
     *
     * @param otherRegistry external registry
     */
    merge(otherRegistry?: Registry): Registry;
    /**
     * Returns extended or replaced entity
     *
     * @param base base implementation
     * @param overrides overridden implementation
     */
    private mergeEntities;
}
export {};
