func newPlanner(disp Dispatcher,
	provider ref.TypeProvider,
	adapter ref.TypeAdapter,
	attrFactory AttributeFactory,
	cont *containers.Container,
	checked *exprpb.CheckedExpr,
	decorators ...InterpretableDecorator) interpretablePlanner {
	return &planner{
		disp:        disp,
		provider:    provider,
		adapter:     adapter,
		attrFactory: attrFactory,
		container:   cont,
		refMap:      checked.GetReferenceMap(),
		typeMap:     checked.GetTypeMap(),
		decorators:  decorators,
	}
}
newPlanner creates an interpretablePlanner which references a Dispatcher, TypeProvider,
TypeAdapter, Container, and CheckedExpr value. These pieces of data are used to resolve
functions, types, and namespaced identifiers at plan time rather than at runtime since
it only needs to be done once and may be semi-expensive to compute.
package interpreter
import (
	"fmt"
	"strings"
	"github.com/google/cel-go/common/containers"
	"github.com/google/cel-go/common/operators"
	"github.com/google/cel-go/common/types"
	"github.com/google/cel-go/common/types/ref"
	"github.com/google/cel-go/interpreter/functions"
	exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
)
type interpretablePlanner interface {
	Plan(expr *exprpb.Expr) (Interpretable, error)
}