use std::collections::HashMap;
use crate::CupelError;
use crate::model::{ContextBudget, ContextItem, ScoredItem};
use crate::slicer::Slicer;
pub(crate) fn compute_effective_budget(
budget: &ContextBudget,
pinned_tokens: i64,
) -> ContextBudget {
let effective_max = (budget.max_tokens() - budget.output_reserve() - pinned_tokens).max(0);
let effective_target = (budget.target_tokens() - pinned_tokens)
.max(0)
.min(effective_max);
ContextBudget::new(effective_max, effective_target, 0, HashMap::new(), 0.0).expect(
"effective budget is valid: both values are non-negative and target <= max by construction",
)
}
pub(crate) fn slice_items(
sorted: &[ScoredItem],
budget: &ContextBudget,
pinned_tokens: i64,
slicer: &dyn Slicer,
) -> Result<Vec<ContextItem>, CupelError> {
let adjusted = compute_effective_budget(budget, pinned_tokens);
slicer.slice(sorted, &adjusted)
}