use crate::prelude::*;
use std::collections::HashSet;
#[derive(Clone, Debug)]
pub struct InferResult {
infer_facts: Vec<String>,
facts: Vec<Fact>,
}
impl InferResult {
pub fn new() -> Self {
InferResult {
infer_facts: vec![],
facts: vec![],
}
}
pub fn from_fact(fact: &Fact) -> Self {
let mut r = Self::new();
r.new_fact(fact);
r
}
pub fn is_empty(&self) -> bool {
self.infer_facts.is_empty() && self.facts.is_empty()
}
pub fn infer_lines(&self) -> &[String] {
&self.infer_facts
}
pub fn infer_lines_unique_in_order(&self) -> Vec<String> {
let mut seen = HashSet::new();
self.infer_facts
.iter()
.filter(|s| seen.insert((*s).clone()))
.cloned()
.collect()
}
pub fn inferred_facts(&self) -> &[Fact] {
&self.facts
}
pub fn join_infer_lines(&self, sep: &str) -> String {
self.infer_facts.join(sep)
}
pub fn new_with_msg(&mut self, msg: String) {
self.infer_facts.push(msg);
}
pub fn new_fact(&mut self, fact: &Fact) {
self.infer_facts.push(fact.to_string());
self.facts.push(fact.clone());
}
pub fn push_atomic_fact(&mut self, atomic_fact: &AtomicFact) {
self.infer_facts.push(atomic_fact.to_string());
self.facts.push(Fact::AtomicFact(atomic_fact.clone()));
}
pub fn new_infer_result_inside(&mut self, other_infer_result: InferResult) {
self.infer_facts.extend(other_infer_result.infer_facts);
self.facts.extend(other_infer_result.facts);
}
}