use std::borrow::Borrow;
use crate::{
context::GenericContext,
db::LevelIndex,
misc::log::targets::{self},
structures::literal::{abLiteral, Literal},
types::err::{self},
};
pub type ConsequenceQ = std::collections::VecDeque<(abLiteral, LevelIndex)>;
pub enum Ok {
Qd,
}
impl<R: rand::Rng + std::default::Default> GenericContext<R> {
pub fn clear_q(&mut self, from: LevelIndex) {
self.consequence_q.retain(|(_, c)| *c < from);
}
pub fn q_literal(&mut self, literal: impl Borrow<abLiteral>) -> Result<Ok, err::Queue> {
let valuation_result = unsafe {
self.atom_db.set_value(
literal.borrow().atom(),
literal.borrow().polarity(),
Some(self.literal_db.decision_count()),
)
};
match valuation_result {
Ok(_) => {
self.consequence_q
.push_back((*literal.borrow(), self.literal_db.decision_count()));
Ok(Ok::Qd)
}
Err(_) => {
log::trace!(target: targets::QUEUE, "Queueing {} failed.", literal.borrow());
Err(err::Queue::Conflict)
}
}
}
}