Add initial support for SEQUENCE integration.
[trees.git] / sequence.lisp
diff --git a/sequence.lisp b/sequence.lisp
new file mode 100644 (file)
index 0000000..1d7b2db
--- /dev/null
@@ -0,0 +1,35 @@
+(in-package :trees)
+
+(defmethod sequence:length ((binary-tree binary-tree))
+  (size binary-tree))
+
+(defmethod sequence:make-simple-sequence-iterator ((binary-tree binary-tree)
+                                                   &key from-end (start 0) end)
+  (when (or (not (zerop start)) end)
+    (error "~A and ~A are unsupported for ~A" 'start 'end 'binary-tree))
+  (multiple-value-bind (current stack)
+      (extreme-node-with-path (root binary-tree) (not from-end))
+    (declare (ignore current))
+    (values stack NIL from-end)))
+
+(defmethod sequence:iterator-step ((binary-tree binary-tree) iterator from-end)
+  (let* ((current (car iterator))
+         (stack (cdr iterator))
+         (node (if from-end (left current) (right current))))
+    (cond
+      ((null node)
+       stack)
+      (t
+       (multiple-value-bind (current stack)
+           (extreme-node-with-path node (not from-end) stack)
+         (declare (ignore current))
+         stack)))))
+
+(defmethod sequence:iterator-endp ((binary-tree binary-tree) iterator limit from-end)
+  (declare (ignore limit from-end))
+  (null iterator))
+
+(defmethod sequence:iterator-element ((binary-tree binary-tree) iterator)
+  (datum (car iterator)))
+
+;; (defmethod sequence:iterator-index ((binary-tree binary-tree) iterator))