mod compose;
mod context;
mod error;
mod fold;
mod result;
pub mod checkpoint;
pub use compose::{filter, map, DualFold, FilterFold, MapFold, SequentialFold};
pub use context::{FoldContext, SharedJson};
pub use error::{FoldError, FoldResult, FoldResult as FoldResultType};
pub use fold::{
fold_fn, AnyFold, BoxedFold, CommonFold, CommonFoldState, CountFold, FilterCountFold, FnFold,
Fold, FoldFailure, SumI64Fold, TryFold,
};
pub use result::FoldOutcome;
pub use checkpoint::{Checkpoint, CheckpointStore, InMemoryCheckpointStore};
pub mod anchor;
pub use anchor::{Anchor, AnchorGraph, AnchorRef, BfsAnchor};
pub mod selector;
pub use selector::{GreedySelector, Selector, SelectorInput, SelectorOutput, SelectorWeights};
pub mod objective;
pub mod ordering;
pub use khive_score::{cmp_asc_then_id, cmp_desc_then_id, DeterministicScore};
pub use objective::builtin::{
FirstMatchObjective, HasImportance, HasTimestamp, ImportanceObjective, MaxScoreObjective,
RecencyObjective, RelevanceObjective, ThresholdObjective,
};
pub use objective::compose::{
ConsensusObjective, NegateObjective, PriorityObjective, ScaleObjective, UnionObjective,
WeightedObjective,
};
pub use objective::error::{ObjectiveError, ObjectiveResult};
pub use objective::{objective_fn, DeterministicObjective, Objective, ObjectiveContext, Selection};
pub use ordering::{
canonical_f32, canonical_f64, cmp_asc_score_then_id, cmp_desc_score_then_id, HasId, Ranked,
ScoredEntry,
};
pub struct ComposePipeline<T> {
pub anchor: Box<dyn Anchor>,
pub objective: Box<dyn Objective<T>>,
pub selector: Box<dyn Selector<T>>,
}
impl<T: Clone + Send + Sync + 'static> ComposePipeline<T> {
pub fn execute(
&self,
_graph: &AnchorGraph,
candidates: Vec<SelectorInput<T>>,
budget: usize,
weights: &SelectorWeights,
context: &ObjectiveContext,
) -> Result<SelectorOutput<T>, FoldError> {
let scored = candidates
.into_iter()
.map(|mut candidate| {
candidate.score = self.objective.score(&candidate.content, context) as f32;
candidate
})
.collect();
self.selector.select(scored, budget, weights)
}
}