1use crate::CompleteAnswer;
9use chalk_ir::interner::Interner;
10use chalk_ir::Substitution;
11use std::fmt::Debug;
12
13pub enum AnswerResult<I: Interner> {
14 Answer(CompleteAnswer<I>),
16
17 NoMoreSolutions,
19
20 Floundered,
22
23 QuantumExceeded,
26}
27
28impl<I: Interner> AnswerResult<I> {
29 pub fn is_answer(&self) -> bool {
30 matches!(self, Self::Answer(_))
31 }
32
33 pub fn answer(self) -> CompleteAnswer<I> {
34 match self {
35 Self::Answer(answer) => answer,
36 _ => panic!("Not an answer."),
37 }
38 }
39
40 pub fn is_no_more_solutions(&self) -> bool {
41 matches!(self, Self::NoMoreSolutions)
42 }
43
44 pub fn is_quantum_exceeded(&self) -> bool {
45 matches!(self, Self::QuantumExceeded)
46 }
47}
48
49impl<I: Interner> Debug for AnswerResult<I> {
50 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51 match self {
52 AnswerResult::Answer(answer) => write!(fmt, "{:?}", answer),
53 AnswerResult::Floundered => write!(fmt, "Floundered"),
54 AnswerResult::NoMoreSolutions => write!(fmt, "None"),
55 AnswerResult::QuantumExceeded => write!(fmt, "QuantumExceeded"),
56 }
57 }
58}
59
60pub trait AnswerStream<I: Interner> {
61 fn peek_answer(&mut self, should_continue: impl Fn() -> bool) -> AnswerResult<I>;
64
65 fn next_answer(&mut self, should_continue: impl Fn() -> bool) -> AnswerResult<I>;
68
69 fn any_future_answer(&self, test: impl Fn(&Substitution<I>) -> bool) -> bool;
72}