]> Repositorios git - scryer-prolog.git/commitdiff
correct acyclic iteration.
authorMark Thom <[email protected]>
Fri, 9 Feb 2018 23:31:56 +0000 (16:31 -0700)
committerMark Thom <[email protected]>
Fri, 9 Feb 2018 23:31:56 +0000 (16:31 -0700)
src/prolog/heap_iter.rs

index 53f4ddc1540acc5d11b4c0291f6714621df996d3..608d5d13e0e28836ca1c3e6246f6c43540668e74 100644 (file)
@@ -146,14 +146,8 @@ pub struct HeapCellAcyclicIterator<HeapCellIter> {
 
 impl<HeapCellIter: MutStackHeapCellIterator> HeapCellAcyclicIterator<HeapCellIter>
 {
-    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<HeapCellIter> Iterator for HeapCellAcyclicIterator<HeapCellIter>
                       + MutStackHeapCellIterator
 {
     type Item = HeapCellValue;
-    
+
     fn next(&mut self) -> Option<Self::Item> {
-        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()
     }
 }