import { Observable, Observer } from 'rxjs';
import { Change } from './types/changes';
export declare class State<T> extends Observable<T | undefined> implements Observer<T | undefined> {
    protected _value: T | undefined;
    readonly downstream: Observable<Change<T>>;
    readonly upstream: Observer<Change<T>>;
    private _changesub;
    constructor(initial: T | undefined);
    constructor(initial: T | undefined, downstream: Observable<Change<T>>, upstream: Observer<Change<T>>);
    next(t: T | undefined): void;
    error(err: any): void;
    complete(): void;
    get value(): T;
    set value(t: T);
    sub<K extends keyof T>(key: K): State<T[K]>;
    subDownstream<K extends keyof T>(key: K, current: () => T[K] | undefined): Observable<{
        value: T[K] | undefined;
        trace: any;
    }>;
    subUpstream<K extends keyof T>(key: K): Observer<Change<T[K]>>;
}
export declare function state<T>(initial: T | undefined): State<T>;
