Skip to main content

basic/
basic.rs

1//! Basic usage: fire tasks with metrics, detect patterns.
2
3use crackle_runtime::{CrackleTask, Kiln, ThermalProfile, TaskOutput};
4
5struct NumberTask {
6    value: f64,
7    name: String,
8}
9
10impl CrackleTask for NumberTask {
11    type Output = f64;
12
13    fn fire(&self) -> TaskOutput<Self::Output> {
14        TaskOutput::new(
15            self.value,
16            vec![
17                ("value".into(), self.value),
18                ("abs".into(), self.value.abs()),
19                ("squared".into(), self.value * self.value),
20            ],
21        )
22    }
23
24    fn label(&self) -> String {
25        self.name.clone()
26    }
27}
28
29fn main() {
30    let mut kiln = Kiln::new(ThermalProfile::fast_cooling());
31
32        kiln.fire_and_record(NumberTask { value: 2.0, name: "a".into() }).unwrap();
33    kiln.fire_and_record(NumberTask { value: 2.1, name: "b".into() }).unwrap();
34    kiln.fire_and_record(NumberTask { value: 9.8, name: "c".into() }).unwrap();
35    kiln.fire_and_record(NumberTask { value: 10.0, name: "d".into() }).unwrap();
36    kiln.fire_and_record(NumberTask { value: 2.2, name: "e".into() }).unwrap();
37
38    println!("Tasks in kiln: {}", kiln.task_count());
39
40    let patterns = kiln.cool();
41    println!("\nDetected {} pattern(s):\n", patterns.len());
42
43    for p in &patterns {
44        println!("[{}] {}", p.kind(), p.description());
45        println!("  confidence: {:.2}", p.confidence());
46        println!("  tasks: {:?}\n", p.involved_tasks());
47    }
48}