export declare const $kind: unique symbol;
export declare const $flat: unique symbol;
export declare type StringMap<$Type> = {
    [key: string]: $Type;
};
export declare enum FieldKind {
    Number = 0,
    String = 1,
    Boolean = 2,
    Array = 3,
    Object = 4,
    Set = 5,
    Map = 6,
    Dynamic = 7
}
export declare type Field = {
    [$kind]: FieldKind;
};
export declare type Schema = {
    [key: string]: Field | Schema;
};
export declare type FieldData<$Type> = Field & {
    get(t?: $Type): $Type;
};
export declare type FieldNumber = FieldData<number> & {
    [$kind]: FieldKind.Number;
};
export declare type FieldString = FieldData<string> & {
    [$kind]: FieldKind.String;
};
export declare type FieldBoolean = FieldData<boolean> & {
    [$kind]: FieldKind.Boolean;
};
export declare type FieldArray<$Type, $Props = unknown> = FieldData<$Type[]> & {
    [$kind]: FieldKind.Array;
    element: Schema | FieldOf<$Type, $Props>;
};
export declare type FieldObject<$Type, $Props = unknown> = FieldData<StringMap<$Type>> & {
    [$kind]: FieldKind.Object;
    key: FieldOf<string>;
    element: Schema | FieldOf<$Type, $Props>;
};
export declare type FieldSet<$Type, $Props = unknown> = FieldData<Set<$Type>> & {
    [$kind]: FieldKind.Set;
    element: Schema | FieldOf<$Type, $Props>;
};
export declare type FieldMap<K, V, $Props = unknown> = FieldData<Map<K, V>> & {
    [$kind]: FieldKind.Map;
    key: FieldOf<K>;
    element: Schema | FieldOf<V, $Props>;
};
export declare type FieldDynamic<$Type> = FieldData<$Type> & {
    [$kind]: FieldKind.Dynamic;
};
export declare type FieldOf<$Type, $Props = unknown> = $Type extends number ? FieldNumber & $Props : $Type extends string ? FieldString & $Props : $Type extends boolean ? FieldBoolean & $Props : $Type extends (infer _)[] ? FieldArray<_, $Props> : $Type extends StringMap<infer _> ? FieldObject<_, $Props> : $Type extends Set<infer _> ? FieldSet<_, $Props> : $Type extends Map<infer K, infer V> ? FieldMap<K, V, $Props> : FieldData<$Type>;
export declare type FieldGet<$Field extends Field> = $Field extends FieldNumber ? number : $Field extends FieldString ? string : $Field extends FieldBoolean ? boolean : $Field extends FieldArray<infer _> ? _[] : $Field extends FieldObject<infer _> ? StringMap<_> : $Field extends FieldSet<infer _> ? Set<_> : $Field extends FieldMap<infer K, infer V> ? Map<K, V> : $Field extends FieldDynamic<infer _> ? _ : unknown;
export declare type FieldExtract<$Type> = $Type extends Field ? FieldGet<$Type> : $Type extends Schema ? {
    [K in keyof $Type]: FieldExtract<$Type[K]>;
} : never;
export declare type FieldPrimitive<$Props = unknown> = $Props & (FieldNumber | FieldString | FieldBoolean | FieldDynamic<unknown>);
export declare type FieldComplex<$Props = unknown> = FieldArray<unknown, $Props> | FieldObject<unknown, $Props> | FieldSet<unknown, $Props> | FieldMap<unknown, unknown, $Props>;
export declare type FieldAny = FieldPrimitive | FieldComplex;
export declare type CollatedNodeBase = {
    id: number;
    hi: number;
    lo: number;
    deep: boolean;
    traverse: (FieldString | FieldNumber)[];
};
export declare type CollatedNodeSchema<$Props = unknown> = CollatedNodeBase & {
    keys: string[];
    keysByFieldId: string[];
    fields: CollatedNode<$Props>[];
    fieldsByKey: {
        [key: string]: CollatedNode<$Props>;
    };
    fieldIdsByKey: {
        [key: string]: number;
    };
};
export declare type CollatedNodeField<$Props> = (FieldComplex<$Props> | FieldPrimitive<$Props>) & CollatedNodeBase;
export declare type CollatedNodeFieldComplex<$Props = unknown> = FieldComplex<$Props> & CollatedNodeBase;
export declare type CollatedNode<$Props = unknown> = CollatedNodeSchema<$Props> | CollatedNodeField<$Props>;
export declare type ModelFlat<$Props = unknown> = {
    [key: number]: {
        [f: number]: CollatedNode<$Props>;
    };
};
export declare type Model<$Props = unknown> = {
    [$flat]: ModelFlat<$Props>;
    [key: number]: CollatedNode<$Props>;
};
//# sourceMappingURL=model.d.ts.map