Add initial support for SEQUENCE integration.
[trees.git] / sequence.lisp
1 (in-package :trees)
2
3 (defmethod sequence:length ((binary-tree binary-tree))
4   (size binary-tree))
5
6 (defmethod sequence:make-simple-sequence-iterator ((binary-tree binary-tree)
7                                                    &key from-end (start 0) end)
8   (when (or (not (zerop start)) end)
9     (error "~A and ~A are unsupported for ~A" 'start 'end 'binary-tree))
10   (multiple-value-bind (current stack)
11       (extreme-node-with-path (root binary-tree) (not from-end))
12     (declare (ignore current))
13     (values stack NIL from-end)))
14
15 (defmethod sequence:iterator-step ((binary-tree binary-tree) iterator from-end)
16   (let* ((current (car iterator))
17          (stack (cdr iterator))
18          (node (if from-end (left current) (right current))))
19     (cond
20       ((null node)
21        stack)
22       (t
23        (multiple-value-bind (current stack)
24            (extreme-node-with-path node (not from-end) stack)
25          (declare (ignore current))
26          stack)))))
27
28 (defmethod sequence:iterator-endp ((binary-tree binary-tree) iterator limit from-end)
29   (declare (ignore limit from-end))
30   (null iterator))
31
32 (defmethod sequence:iterator-element ((binary-tree binary-tree) iterator)
33   (datum (car iterator)))
34
35 ;; (defmethod sequence:iterator-index ((binary-tree binary-tree) iterator))