Skip to main content

Function Registry

From-v4.2Experimental

ExpressionFunctionRegistry maintains an isolated table of JavaScript functions that expression evaluators can call with evaluated arguments.

import {
ExpressionFunctionRegistry,
compile,
type ExpressionFunctionLibrary
} from '@math.gl/expressions';

const statistics: ExpressionFunctionLibrary = {
mean: (...values: number[]) => values.reduce((sum, value) => sum + value, 0) / values.length
};

const registry = new ExpressionFunctionRegistry()
.registerFunctions(statistics)
.registerFunction('double', (value: number) => value * 2);

const evaluate = compile('double(mean(a, b, c))', {registry});
evaluate({a: 1, b: 2, c: 3}); // 4

Registries do not modify module-global state. Separate registries may use the same function name without affecting each other.

constructor(functionTables?: ExpressionFunctionLibrary[])​

Creates a registry and optionally registers function tables in order.

registerFunction(name, fn, options?): this​

Registers one JavaScript function. The name must be a JavaScript-style identifier that can be called directly from an expression.

Duplicate names throw unless {replace: true} is supplied:

registry.registerFunction('scale', (value) => value * 2);
registry.registerFunction('scale', (value) => value * 3, {replace: true});

registerFunctions(functionTable, options?): this​

Registers a complete function table. Validation is atomic: no functions are added if any entry is invalid or conflicts with the registry.

unregisterFunction(name): boolean​

Removes a function and reports whether the name was registered.

hasFunction(name): boolean​

Reports whether the registry contains a function.

getFunction(name): ExpressionFunction | undefined​

Returns a registered function.

getFunctionTable(): Readonly<ExpressionFunctionLibrary>​

Returns a frozen snapshot of the current registrations.

Resolution Order​

When a registry and libraries are both supplied, identifiers resolve in this order:

  1. Evaluation context
  2. Later function libraries
  3. Earlier function libraries
  4. Function registry

This allows row-specific values to take precedence while keeping the registry reusable.

Async Functions​

Use evalAsync() or compileAsync() when registered functions return promises. Arguments are evaluated before invocation and promise results are awaited before surrounding operations continue.