// Copyright 2020 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Package adt represents partially and fully evaluated CUE types.
//
// This package introduces several categories of types that indicate some set of
// values that may be used in a certain situation. Concrete types may belong to
// multiple categories.
//
//
// Abstract Types
//
// The following types describe the a place where a value may be used:
//
//    Decl       a value than can be used as a StructLit element.
//    Elem       a value than can be used as a ListLit element.
//    Expr       represents an Expr in the CUE grammar.
//    Value      a fully evaluated value that has no references (except for
//               children in composite values).
//    Node       any of the above values.
//
// The following types categorize nodes by function:
//
//    Resolver   a reference to position in the result tree.
//    Evaluator  evaluates to 1 value.
//    Yielder    evaluates to 0 or more values.
//    Validator  validates another value.
//
//
// Reference resolution algorithm
//
// A Resolver is resolved within the context of an Environment. In CUE, a
// reference is evaluated by substituting it with a copy of the value to which
// it refers. If the copied value itself contains references we can distinguish
// two different cases. References that refer to values within the copied
// reference (not regarding selectors) will henceforth point to the copied node.
// References that point to outside the referened value will keep referring to
// their original value.
//
//      a: b: {
//        c: int
//        d: c
//        e: f
//      }
//      f: 4
//      g: a.b { // d.c points to inside the referred value, e.f, not.
//        c: 3
//      }
//
// The implementation doesn't actually copy referred values, but rather resolves
// references with the aid of an Environment. During compile time, each
// references is associated with the label and a number indicating in which
// parent scope (offset from the current) this label needs to be looked up. An
// Environment keeps track of the point at which a value was referenced,
// providing enough information to look up the labeled value. This Environment
// is the identical for all references within a fields conjunct. Often, an
// Environment can even be shared among conjuncts.
//
//
// Values
//
// Values are fully evaluated expressions. As this means that all references
// will have been eliminated, Values are fully defined without the need for an
// Environment. Additionally, Values represent a fully evaluated form, stripped
// of any comprehensions, optional fields or embeddings.
//
package adt
