import { BehaviorSubject, MonoTypeOperatorFunction, Observable, OperatorFunction } from 'rxjs';
import { BaseEntity } from '../base.entity';
import { ID } from '../utils';
import { EntityMap, Entries, HashMap } from '../utils/types';
export declare class ValueState<T> {
    protected readonly stream$: BehaviorSubject<T>;
    readonly value$: Observable<T>;
    constructor(value?: T, operator?: OperatorFunction<any, any>);
    get value(): T;
    set(value: T): ValueState<T>;
    emit(): void;
    select(): Observable<T>;
    select(project: (value: T) => T): Observable<T>;
    select<R>(project: (value: T) => R): Observable<R>;
}
export declare function createValueState<T>(value: T, operator?: OperatorFunction<any, any>): ValueState<T>;
export declare class EntityState<T extends BaseEntity> extends ValueState<EntityMap<T>> {
    protected stream$: BehaviorSubject<EntityMap<T>>;
    value$: Observable<EntityMap<T>>;
    constructor(value?: EntityMap<T>, entityPipe?: MonoTypeOperatorFunction<EntityMap<T>>);
    destroy(): void;
    clear(destroy?: boolean): this;
    get(id: ID): T;
    has(id: ID): boolean;
    add(entity: T): EntityState<T>;
    addMany(entities: T[]): EntityState<T>;
    remove(id: ID, destroy?: boolean): EntityState<T>;
    array(): T[];
    array$(): Observable<T[]>;
    forEach(cb: (value: T, key: string, map: EntityMap<T>) => void): void;
    map<R = any>(cb: (value: T, index: number, array: T[]) => R): R[];
}
export declare function createEntityState<T extends BaseEntity>(value: HashMap<T> | Entries<T>, entityPipe: MonoTypeOperatorFunction<Map<ID, T>>): EntityState<T>;
