hypertune
Version:
[Hypertune](https://www.hypertune.com/) is the most flexible platform for feature flags, A/B testing, analytics and app configuration. Built with full end-to-end type-safety, Git-style version control and local, synchronous, in-memory flag evaluation. Opt
54 lines • 3.11 kB
TypeScript
import { CommitConfig, Expression, ObjectValue, ObjectValueWithVariables, Query, SplitMap, Value } from "../types";
/**
* Summary
*
* Expression reduction takes a query and/or some arguments and applies
* interpreter steps to reduce the expression as much as possible. It is
* analogous to beta-reduction in the lambda calculus. If all function arguments
* are supplied, we return a fully reduced expression in "normal form". Normal
* form expressions can then be converted into JSON. Otherwise, we return a
* partially reduced expression in "complex form" which requires further
* reduction with additional arguments for the function expressions it contains.
*
* Each time we reduce an expression into a simpler form, we keep track of the
* expressions we've needed to "evaluate" to compute the reduction. We track
* this via "logs" which we attach to the result expression. This lets users
* visualize how often different parts of the expression tree have been used.
*
* Partial Field Arguments
*
* When a query field has a partial field arguments object, we reduce the
* expression tree as much as possible given the available fields within this
* object and leave the function expression that references it intact so that on
* a subsequent reduction, when the full field arguments object can be provided,
* we can fully reduce the tree correctly. There are 3 changes to the main
* reduction logic that allow for this:
*
* 1. We leave function expressions intact if any of the arguments passed to it
* is a partial object.
*
* 2. We have a reduction flag that toggles partial object variable reduction.
* If it's off (which it is by default), we do not reduce variable expressions
* that reference partial objects.
*
* 3. The only time we enable partial object variable reduction is in the
* (initial) object reduction in a get field expression when we check to see if
* we can access the desired field. (And if we can't, we return the get field
* expression with its object reduced but with partial object variable reduction
* disabled.)
*
* Complexity and Logic
*
* For any expression, there are a finite number of reduction steps until it
* cannot be reduced further. The reduction logic of each expression type
* attempts to reduce the expression and its children as much as possible given
* the current context. The logic for application and variable expressions is
* especially prone to complexity blow-up. In particular, an application
* argument should be reduced as much as possible before being passed to a
* function expression reduction, where it becomes a variable, so that the
* reduction isn't repeated for every variable expression in the function body
* that references it.
*/
export default function reduce(splits: SplitMap, commitConfig: CommitConfig, query: Query<ObjectValueWithVariables> | null, variableValues: ObjectValue, rootExpression: Expression, allowMissingVariables: boolean): Expression;
export declare function areEqual(a: Value | null | undefined, b: Value | null | undefined): boolean;
//# sourceMappingURL=reduce.d.ts.map