Built-in operator node types for GraphReFly.
Operators in this crate are specialized node types implemented
directly against the Core protocol — they are not "user fns wrapped
in nodes." A map operator's plumbing (dirty propagation, equals
dedup, batch handling) runs entirely in Rust; only the user-supplied
(T) -> U callback crosses the FFI boundary on each fire.
Status
M3 complete: transform/combine/flow/higher-order/subscription/producer
operators, cold sources, stratify, and napi parity (see
docs/migration-status.md). Per-operator state uses
OperatorScratch on
NodeRecord (D026).
Module layout
- [
transform] — map, filter, scan, reduce, distinctUntilChanged, pairwise (✅ Slice C-1) - [
combine] — combine, merge, withLatestFrom (✅ Slice C-2) - [
flow] — take, skip, takeWhile, last + first/find/element_at sugar (✅ Slice C-3) - [
temporal] — sample, debounce, throttle, delay, audit, interval, timeout, buffer_time, window_time (✅ Slice T) switching— switchMap, mergeMap, concatMapgating— valve, gate, budgetGate, policyGateresilience— retry, circuitBreaker, timeout, fallback, rateLimiter, tokenBucket
Layering
This crate depends on graphrefly-core only (per the user-direction
constraint that operators do not depend on graphrefly-graph).
Operator factories accept &Core directly. User callbacks travel
through the [OperatorBinding] super-trait of BindingBoundary,
which the binding crate (e.g., a TestOperatorBinding for tests, the
napi-rs / pyo3 bindings in production) implements.