use parking_lot::Mutex;
pub struct ReflectionTracker {
threshold: u32,
accumulated: Mutex<u32>,
}
impl ReflectionTracker {
pub fn new(threshold: u32) -> Self {
Self {
threshold,
accumulated: Mutex::new(0),
}
}
pub fn record(&self, importance: u8) -> bool {
let mut acc = self.accumulated.lock();
*acc += importance as u32;
if *acc >= self.threshold {
*acc = 0;
true
} else {
false
}
}
pub fn accumulated(&self) -> u32 {
*self.accumulated.lock()
}
}
pub const REFLECTION_HINT: &str = "\n\n[Reflection suggested] You have stored several important memories recently. \
Take a moment to reflect on what you've learned. Use memory_store with high importance \
to record any insights, patterns, or connections you notice across your recent memories.";
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tracker_triggers_at_threshold() {
let tracker = ReflectionTracker::new(10);
assert!(!tracker.record(5)); assert!(!tracker.record(4)); assert!(tracker.record(1)); }
#[test]
fn tracker_resets_after_trigger() {
let tracker = ReflectionTracker::new(10);
assert!(tracker.record(10));
assert_eq!(tracker.accumulated(), 0);
assert!(!tracker.record(5));
assert_eq!(tracker.accumulated(), 5);
}
#[test]
fn tracker_exceeds_threshold() {
let tracker = ReflectionTracker::new(10);
assert!(tracker.record(15));
assert_eq!(tracker.accumulated(), 0);
}
#[test]
fn tracker_many_small_values() {
let tracker = ReflectionTracker::new(10);
for _ in 0..9 {
assert!(!tracker.record(1));
}
assert!(tracker.record(1));
}
#[test]
fn tracker_triggers_multiple_times() {
let tracker = ReflectionTracker::new(5);
assert!(tracker.record(5)); assert!(tracker.record(5)); assert!(!tracker.record(3)); assert!(tracker.record(2)); }
}