(declare (unit util-bst)) (import duck) (module* util-bst #:doc ("Binary Search Tree implementation") ( make-bst bst? bst-empty? bst-ref bst-contains? bst-set ;;bst-remove ;; ;;bst->kvv ;;kvv->bst ;;kvv-filter ;;bst-balance util-bst-tests! ) (import scheme (chicken condition) util-tag testing) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Node ;; Creates BST node with no children (define (make-bst-node key value) (cons (cons key value) (cons #f #f))) ;; Read-only accessors to BST node (define bst-node-kv car) (define bst-node-key caar) (define bst-node-value cdar) (define bst-node-left cadr) (define bst-node-right cddr) ;; Returns BST node with updated node value (define (set-bst-node-value n v) (cons (cons (bst-node-key n) v) (cdr n))) ;; Updates BST node left child (define (set-bst-node-left n l) (cons (car n) (cons l (bst-node-right n)))) ;; Updates BST node right child (define (set-bst-node-right n r) (cons (car n) (cons (bst-node-left n) r))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; BST ;; Unique tag (define TAG-BST (make-tag bst)) (define/doc (make-bst subtag EQ?