(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))