forge-guardrails 0.1.0

Foundation types for an LLM-agent workflow framework
Documentation
use std::collections::VecDeque;

pub(crate) struct ScoreCache<T> {
    pub(crate) capacity: usize,
    pub(crate) entries: VecDeque<(String, T)>,
}

impl<T: Clone> ScoreCache<T> {
    pub(crate) fn new(capacity: usize) -> Self {
        Self {
            capacity,
            entries: VecDeque::with_capacity(capacity.min(128)),
        }
    }

    pub(crate) fn get(&mut self, key: &str) -> Option<T> {
        let index = self
            .entries
            .iter()
            .position(|(entry_key, _)| entry_key == key)?;
        let (key, value) = self.entries.remove(index)?;
        let cloned = value.clone();
        self.entries.push_front((key, value));
        Some(cloned)
    }

    pub(crate) fn insert(&mut self, key: String, value: T) {
        if self.capacity == 0 {
            return;
        }
        if let Some(index) = self
            .entries
            .iter()
            .position(|(entry_key, _)| entry_key == &key)
        {
            let _ = self.entries.remove(index);
        }
        self.entries.push_front((key, value));
        while self.entries.len() > self.capacity {
            let _ = self.entries.pop_back();
        }
    }

    #[cfg(test)]
    pub(crate) fn len(&self) -> usize {
        self.entries.len()
    }
}