]> git.eshelyaron.com Git - emacs.git/commitdiff
Implement iterator generator for avl-trees.
authorToby S. Cubitt <tsc25@cantab.net>
Fri, 4 Aug 2017 19:34:28 +0000 (20:34 +0100)
committerToby S. Cubitt <tsc25@cantab.net>
Fri, 4 Aug 2017 19:39:05 +0000 (20:39 +0100)
* lisp/emacs-lisp/avl-tree.el (avl-tree-iter): New iter-defun.

lisp/emacs-lisp/avl-tree.el

index 17f1ffa9f610e12d053e46475ae510a7776f51fb..32f7d2c6d8dba7dcd9e456c7dcfe3eddee45ac29 100644 (file)
@@ -52,7 +52,7 @@
 ;;; Code:
 
 (eval-when-compile (require 'cl-lib))
-
+(require 'generator)
 
 
 ;; ================================================================
@@ -670,6 +670,21 @@ a null element stored in the AVL tree.)"
   (null (avl-tree--stack-store avl-tree-stack)))
 
 
+(iter-defun avl-tree-iter (tree &optional reverse)
+  "Return an AVL tree iterator object.
+
+Calling `iter-next' on this object will retrieve the next element
+from TREE. If REVERSE is non-nil, elements are returned in
+reverse order.
+
+Note that any modification to TREE *immediately* invalidates all
+iterators created from TREE before the modification (in
+particular, calling `iter-next' will give unpredictable results)."
+  (let ((stack (avl-tree-stack tree reverse)))
+    (while (not (avl-tree-stack-empty-p stack))
+      (iter-yield (avl-tree-stack-pop stack)))))
+
+
 (provide 'avl-tree)
 
 ;;; avl-tree.el ends here