/**
 * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author David Sehnal <david.sehnal@gmail.com>
 */
import { OrderedSet } from 'immutable';
import { StateTransform } from '../transform';
import { TransientTree } from './transient';
export { StateTree };
/**
 * An immutable tree where each node requires a unique reference.
 * Represented as an immutable map.
 */
interface StateTree {
    readonly root: StateTransform;
    readonly transforms: StateTree.Transforms;
    readonly children: StateTree.Children;
    /** Refs to all nodes that depend on the given key */
    readonly dependencies: StateTree.Dependencies;
    asTransient(): TransientTree;
}
declare namespace StateTree {
    type Ref = StateTransform.Ref;
    export interface ChildSet {
        readonly size: number;
        readonly values: OrderedSet<Ref>['values'];
        has(ref: Ref): boolean;
        readonly forEach: OrderedSet<Ref>['forEach'];
        readonly map: OrderedSet<Ref>['map'];
        toArray(): Ref[];
        first(): Ref;
    }
    interface _Map<T> {
        readonly size: number;
        has(ref: Ref): boolean;
        get(ref: Ref): T;
    }
    export interface Transforms extends _Map<StateTransform> {
    }
    export interface Children extends _Map<ChildSet> {
    }
    export interface Dependencies extends _Map<ChildSet> {
    }
    /**
     * Create an instance of an immutable tree.
     */
    export function createEmpty(customRoot?: StateTransform): StateTree;
    export function create(nodes: Transforms, children: Children, dependencies: Dependencies): StateTree;
    /**
     * Visit all nodes in a subtree in "post order", meaning leafs get visited first.
     */
    export function doPostOrder<S>(tree: StateTree, root: StateTransform, state: S, f: (node: StateTransform, tree: StateTree, state: S) => boolean | undefined | void): S;
    /**
     * Visit all nodes in a subtree in "pre order", meaning leafs get visited last.
     * If the visitor function returns false, the visiting for that branch is interrupted.
     */
    export function doPreOrder<S>(tree: StateTree, root: StateTransform, state: S, f: (node: StateTransform, tree: StateTree, state: S) => boolean | undefined | void): S;
    /**
     * Get all nodes in a subtree, leafs come first.
     */
    export function subtreePostOrder(tree: StateTree, root: StateTransform): StateTransform<import("../transformer").StateTransformer<import("../object").StateObject<any, import("../object").StateObject.Type<any>>, import("../object").StateObject<any, import("../object").StateObject.Type<any>>, any>>[];
    export interface Serialized {
        /** Transforms serialized in pre-order */
        transforms: StateTransform.Serialized[];
    }
    export function toJSON(tree: StateTree): Serialized;
    export function fromJSON(data: Serialized): StateTree;
    export function dump(tree: StateTree): void;
    /** Check if the subtree with the given root has the provided ref */
    export function subtreeHasRef(tree: StateTree, root: StateTransform.Ref, ref: StateTransform.Ref): boolean;
    export function getDecoratorRoot(tree: StateTree, ref: StateTransform.Ref): StateTransform.Ref;
    export {};
}
