X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=sequence.lisp;fp=sequence.lisp;h=1d7b2db7a782a82b860d7fb5b97ffdbd7c03a172;hb=7f66452f5c49aef4ad5e38a61c887874f7668d4f;hp=0000000000000000000000000000000000000000;hpb=7b06048af0248c4302088c758208276f9faf2beb;p=trees.git diff --git a/sequence.lisp b/sequence.lisp new file mode 100644 index 0000000..1d7b2db --- /dev/null +++ b/sequence.lisp @@ -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))