import { Signal, WritableSignal } from '@angular/core';
import { Subscription } from 'rxjs';
import { Accessor } from '../accessor/interface';
import { ArrayAccessors, IsValidAccessorKey } from '../type-utils/accessor.types';
import { GetPropertyType, SimplePath } from '../type-utils/get.types';
import { IValidator, ValidationUpdate } from '../validation/interface';
import { Validation } from '../validation/validation';
export interface AccessorCreateOptions {
    isEqual: (val1: unknown, val2: unknown) => boolean;
    validators: {
        [key: string]: Array<IValidator>;
    };
    onValidationChange: (update: ValidationUpdate) => void;
}
export interface IAccessorOptions<TProperties extends object> {
    validators: {
        [key in SimplePath<TProperties>]?: Array<IValidator>;
    };
}
export interface AccessorPropertyConfig {
    validators?: Array<IValidator>;
    isEqual?: (val1: unknown, val2: unknown) => boolean;
}
export type AccessorConfig<TProperties extends object> = {
    [property in SimplePath<TProperties>]?: AccessorPropertyConfig;
};
export declare abstract class AbstractAccessor<TProperties extends object> {
    config: AccessorConfig<TProperties>;
    readonly validation: Validation<TProperties>;
    readonly isDirty: Signal<boolean>;
    protected dirtyKeys: Map<string, boolean>;
    protected writableIsDirty: WritableSignal<boolean>;
    protected accessorMap: Map<string, Accessor<any, any>>;
    protected accessorSubscriptionsMap: Map<string, Subscription>;
    constructor(config?: AccessorConfig<TProperties>);
    access<TKey extends string | undefined = undefined>(key?: IsValidAccessorKey<TKey, TProperties>): [TKey] extends [undefined] ? Accessor<TProperties, TProperties> : Accessor<TProperties, GetPropertyType<TProperties, TKey>>;
    getAccessors(): ArrayAccessors<any>;
    removeAccess<TKey extends string>(key: IsValidAccessorKey<TKey, TProperties>): void;
    destroy(): void;
    setPristine(): void;
    protected accessRoot(): Accessor<TProperties, TProperties>;
    protected accessProperty<TKey extends string>(key: IsValidAccessorKey<TKey, TProperties>): Accessor<TProperties, GetPropertyType<TProperties, TKey>>;
    protected abstract createAccessor<TKey extends keyof TProperties>(key: TKey, options: AccessorCreateOptions): Accessor<any, any>;
    protected abstract createRootAccessor(options: AccessorCreateOptions): Accessor<any, any>;
}
