From 211bdd3a13a9172613f70eef7069ba45be1e3436 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Fri, 9 Feb 2018 16:31:56 -0700 Subject: [PATCH] correct acyclic iteration. --- src/prolog/heap_iter.rs | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) 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() } } -- 2.54.0