From: Mark Thom Date: Fri, 9 Feb 2018 23:31:56 +0000 (-0700) Subject: correct acyclic iteration. X-Git-Tag: v0.8.110~573 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=211bdd3a13a9172613f70eef7069ba45be1e3436;p=scryer-prolog.git correct acyclic iteration. --- diff --git a/src/prolog/heap_iter.rs b/src/prolog/heap_iter.rs index 53f4ddc1..608d5d13 100644 --- a/src/prolog/heap_iter.rs +++ b/src/prolog/heap_iter.rs @@ -146,14 +146,8 @@ pub struct HeapCellAcyclicIterator { impl HeapCellAcyclicIterator { - pub fn new(mut iter: HeapCellIter) -> Self { - let mut seen = HashSet::new(); - - if let Some(addr) = iter.stack().last() { - seen.insert(addr.clone()); - } - - HeapCellAcyclicIterator { iter, seen } + pub fn new(iter: HeapCellIter) -> Self { + HeapCellAcyclicIterator { iter, seen: HashSet::new() } } } @@ -162,21 +156,18 @@ impl Iterator for HeapCellAcyclicIterator + MutStackHeapCellIterator { type Item = HeapCellValue; - + fn next(&mut self) -> Option { - while let Some(hcv) = self.iter.next() { - if let Some(addr) = self.iter.stack().pop() { - if self.seen.contains(&addr) { - continue; - } else { - self.iter.stack().push(addr.clone()); - self.seen.insert(addr); - } + while let Some(addr) = self.iter.stack().pop() { + if self.seen.contains(&addr) { + continue; + } else { + self.iter.stack().push(addr.clone()); + self.seen.insert(addr); + break; } - - return Some(hcv); } - None + self.iter.next() } }