heartbit_core/memory/
reflection.rs1use parking_lot::Mutex;
4
5pub struct ReflectionTracker {
11 threshold: u32,
12 accumulated: Mutex<u32>,
13}
14
15impl ReflectionTracker {
16 pub fn new(threshold: u32) -> Self {
17 Self {
18 threshold,
19 accumulated: Mutex::new(0),
20 }
21 }
22
23 pub fn record(&self, importance: u8) -> bool {
26 let mut acc = self.accumulated.lock();
27 *acc += importance as u32;
28 if *acc >= self.threshold {
29 *acc = 0;
30 true
31 } else {
32 false
33 }
34 }
35
36 pub fn accumulated(&self) -> u32 {
38 *self.accumulated.lock()
39 }
40}
41
42pub const REFLECTION_HINT: &str = "\n\n[Reflection suggested] You have stored several important memories recently. \
44 Take a moment to reflect on what you've learned. Use memory_store with high importance \
45 to record any insights, patterns, or connections you notice across your recent memories.";
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn tracker_triggers_at_threshold() {
53 let tracker = ReflectionTracker::new(10);
54
55 assert!(!tracker.record(5)); assert!(!tracker.record(4)); assert!(tracker.record(1)); }
61
62 #[test]
63 fn tracker_resets_after_trigger() {
64 let tracker = ReflectionTracker::new(10);
65
66 assert!(tracker.record(10));
68 assert_eq!(tracker.accumulated(), 0);
69
70 assert!(!tracker.record(5));
72 assert_eq!(tracker.accumulated(), 5);
73 }
74
75 #[test]
76 fn tracker_exceeds_threshold() {
77 let tracker = ReflectionTracker::new(10);
78
79 assert!(tracker.record(15));
81 assert_eq!(tracker.accumulated(), 0);
82 }
83
84 #[test]
85 fn tracker_many_small_values() {
86 let tracker = ReflectionTracker::new(10);
87
88 for _ in 0..9 {
89 assert!(!tracker.record(1));
90 }
91 assert!(tracker.record(1));
93 }
94
95 #[test]
96 fn tracker_triggers_multiple_times() {
97 let tracker = ReflectionTracker::new(5);
98
99 assert!(tracker.record(5)); assert!(tracker.record(5)); assert!(!tracker.record(3)); assert!(tracker.record(2)); }
104}