Skip to content

AlertPredicate ​

What it does ​

Consumer-side adapter that fires an AlertTick when a user-supplied predicate matches an analytic's emission. Composes with any typed row the callback delivers.

rust
// Cargo.toml:
//   kairos = "0.1"
use kairos::{AlertPredicate, AlertTick, Client, GreeksRow};

let client = Client::connect(("me@example.com", "secret"))?;

// `AlertPredicate::new(closure)` constructs a value-typed predicate.
// Evaluate it against each row the `.on_event` callback delivers.
let predicate = AlertPredicate::new(|delta: &f64| delta.abs() > 0.5);

let sub = client
    .live()
    .greeks(["QQQ"])
    .on_event(move |row: &GreeksRow| {
        if predicate.evaluate(&row.delta) {
            let _ = AlertTick { value: row.delta };
        }
    })?;

// ... later ...
sub.unsubscribe();

API surface ​

MethodReturns
AlertPredicate::new(closure)AlertPredicate<T>
predicate.evaluate(&T)bool

The predicate is value-typed, not stream-typed. Composition is a consumer-side concern — drive the predicate inline in the .on_event callback or build an adapter type around it.

Replay parity ​

AlertPredicate is stateless — the underlying analytic's emission stream carries replay-parity by construction; the predicate is a pure function. Replay equivalence is preserved end-to-end.

Why a primitive ​

Cross-analytic alerting is a common downstream concern. The predicate adapter keeps the alerting vocabulary out of every individual analytic's spec and lets the consumer compose the same predicate shape against any output stream.

Proprietary. All rights reserved.