"use strict";
/*!
 * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
 * Licensed under the MIT License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.type = exports.FieldSchema = exports.NodeKind = exports.FieldKind = void 0;
/**
 * Kind of a field on a node.
 * @public
 */
var FieldKind;
(function (FieldKind) {
    /**
     * A field which can be empty or filled.
     * @remarks
     * Allows 0 or one child.
     */
    FieldKind[FieldKind["Optional"] = 0] = "Optional";
    /**
     * A field which must always be filled.
     * @remarks
     * Only allows exactly one child.
     */
    FieldKind[FieldKind["Required"] = 1] = "Required";
})(FieldKind || (exports.FieldKind = FieldKind = {}));
/**
 * Kind of tree node.
 * @public
 */
var NodeKind;
(function (NodeKind) {
    /**
     * A node which serves as a map, storing children under string keys.
     */
    NodeKind[NodeKind["Map"] = 0] = "Map";
    /**
     * A node which serves as an array, storing children in an ordered sequence.
     */
    NodeKind[NodeKind["Array"] = 1] = "Array";
    /**
     * A node which stores a heterogenous collection of children in named fields.
     * @remarks
     * Each field gets its own schema.
     */
    NodeKind[NodeKind["Object"] = 2] = "Object";
    /**
     * A node which stores a single leaf value.
     */
    NodeKind[NodeKind["Leaf"] = 3] = "Leaf";
})(NodeKind || (exports.NodeKind = NodeKind = {}));
/**
 * All policy for a specific field,
 * including functionality that does not have to be kept consistent across versions or deterministic.
 *
 * This can include policy for how to use this schema for "view" purposes, and well as how to expose editing APIs.
 * @sealed @public
 */
class FieldSchema {
    /**
     * @param kind - The [kind](https://en.wikipedia.org/wiki/Kind_(type_theory)) of this field.
     * Determine the multiplicity, viewing and editing APIs as well as the merge resolution policy.
     * @param allowedTypes - What types of tree nodes are allowed in this field.
     */
    constructor(kind, allowedTypes) {
        this.kind = kind;
        this.allowedTypes = allowedTypes;
    }
}
exports.FieldSchema = FieldSchema;
/**
 * The type of a {@link TreeNode}.
 * For moore information about the type, use `Tree.schema(theNode)` instead.
 * @remarks
 * This symbol mainly exists on nodes to allow TypeScript to provide more accurate type checking.
 * `Tree.is` and `Tree.schema` provide a superset of this information in more friendly ways.
 *
 * This symbol should not manually be added to objects as doing so allows the object to be invalidly used where nodes are expected.
 * Instead construct a real node of the desired type using its constructor.
 * @privateRemarks
 * This prevents non-nodes from being accidentally used as nodes, as well as allows the type checker to distinguish different node types.
 * @public
 */
exports.type = Symbol("TreeNode Type");
//# sourceMappingURL=schemaTypes.js.map