use crate::CompleteAnswer;
use chalk_ir::interner::Interner;
use chalk_ir::Substitution;
use std::fmt::Debug;
pub enum AnswerResult<I: Interner> {
Answer(CompleteAnswer<I>),
NoMoreSolutions,
Floundered,
QuantumExceeded,
}
impl<I: Interner> AnswerResult<I> {
pub fn is_answer(&self) -> bool {
match self {
Self::Answer(_) => true,
_ => false,
}
}
pub fn answer(self) -> CompleteAnswer<I> {
match self {
Self::Answer(answer) => answer,
_ => panic!("Not an answer."),
}
}
pub fn is_no_more_solutions(&self) -> bool {
match self {
Self::NoMoreSolutions => true,
_ => false,
}
}
pub fn is_quantum_exceeded(&self) -> bool {
match self {
Self::QuantumExceeded => true,
_ => false,
}
}
}
impl<I: Interner> Debug for AnswerResult<I> {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AnswerResult::Answer(answer) => write!(fmt, "{:?}", answer),
AnswerResult::Floundered => write!(fmt, "Floundered"),
AnswerResult::NoMoreSolutions => write!(fmt, "None"),
AnswerResult::QuantumExceeded => write!(fmt, "QuantumExceeded"),
}
}
}
pub trait AnswerStream<I: Interner> {
fn peek_answer(&mut self, should_continue: impl Fn() -> bool) -> AnswerResult<I>;
fn next_answer(&mut self, should_continue: impl Fn() -> bool) -> AnswerResult<I>;
fn any_future_answer(&self, test: impl Fn(&Substitution<I>) -> bool) -> bool;
}