Function: avl-tree--do-enter

avl-tree--do-enter is a byte-compiled function defined in avl-tree.el.gz.

Signature

(avl-tree--do-enter CMPFUN ROOT BRANCH DATA &optional UPDATEFUN)

Documentation

Enter DATA in BRANCH of ROOT node.

(See avl-tree-enter for UPDATEFUN).

Return cons cell (GREW . DATA), where GREW is t if height of tree ROOT has grown and nil otherwise, and DATA is the inserted data.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/avl-tree.el.gz
(defun avl-tree--do-enter (cmpfun root branch data &optional updatefun)
  "Enter DATA in BRANCH of ROOT node.
\(See `avl-tree-enter' for UPDATEFUN).

Return cons cell (GREW . DATA), where GREW is t if height
of tree ROOT has grown and nil otherwise, and DATA is the
inserted data."
  (let ((br (avl-tree--node-branch root branch)))
    (cond
     ((null br)
      ;; Data not in tree, insert it.
      (setf (avl-tree--node-branch root branch)
            (avl-tree--node-create nil nil data 0))
      (cons t data))

     ((funcall cmpfun data (avl-tree--node-data br))
      (let ((ret (avl-tree--do-enter cmpfun br 0 data updatefun)))
	(cons (and (car ret) (avl-tree--enter-balance root branch 0))
	      (cdr ret))))

     ((funcall cmpfun (avl-tree--node-data br) data)
      (let ((ret (avl-tree--do-enter cmpfun br 1 data updatefun)))
	(cons (and (car ret) (avl-tree--enter-balance root branch 1))
	      (cdr ret))))

     ;; Data already in tree, update it.
     (t
      (let ((newdata
	     (if updatefun
		 (funcall updatefun data (avl-tree--node-data br))
	       data)))
	(if (or (funcall cmpfun newdata data)
		(funcall cmpfun data newdata))
            (error "avl-tree-enter: Updated data does not match existing data"))
	(setf (avl-tree--node-data br) newdata)
	(cons nil newdata))  ; return value
      ))))