aboutsummaryrefslogtreecommitdiffstats
path: root/mcgoron
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-02-17 15:40:07 -0500
committerGravatar Peter McGoron 2025-02-17 15:40:07 -0500
commitff0347d74900db518f848fdd462409d34c834262 (patch)
tree9c21a2bed0b2a32efe383ffd793495e10d1e8d2d /mcgoron
parenttest set-every, set-delete, and set=? (diff)
more tests for set-delete, more efficient implementation
Diffstat (limited to 'mcgoron')
-rw-r--r--mcgoron/weight-balanced-trees/srfi/113/sets.scm28
1 files changed, 16 insertions, 12 deletions
diff --git a/mcgoron/weight-balanced-trees/srfi/113/sets.scm b/mcgoron/weight-balanced-trees/srfi/113/sets.scm
index 03f5045..964ff87 100644
--- a/mcgoron/weight-balanced-trees/srfi/113/sets.scm
+++ b/mcgoron/weight-balanced-trees/srfi/113/sets.scm
@@ -104,13 +104,15 @@
(define set-replace! set-replace)
(define (set-delete-all set elements)
- (let ((cmp (set-element-comparator set)))
- (raw-set
- cmp
- (fold (lambda (element node)
- (delete cmp node element))
- (get-node set)
- elements))))
+ (define cmp (set-element-comparator set))
+ (define (delete node)
+ (if (null? node)
+ '()
+ (with-node (node data ("<" left) (">" right))
+ (if (member data elements (cute =? cmp <> <>))
+ (join2 (delete left) (delete right))
+ (join data (delete left) (delete right))))))
+ (raw-set cmp (delete (get-node set))))
(define set-delete-all! set-delete-all)
(define (set-delete set . elements)
@@ -357,19 +359,21 @@
;;; ;;;;;;;;;;;;
(define (set-adjoin-all set elements)
+ ;; TODO: replace with version that only crawls the tree once.
(let ((cmp (set-element-comparator set)))
(raw-set
cmp
(fold (lambda (new set)
- (update cmp
- set
- new
- (lambda (old) old)
- (lambda () (wb-tree-node new '() '()))))
+ (update cmp
+ set
+ new
+ (lambda (old) old)
+ (lambda () (wb-tree-node new '() '()))))
(get-node set)
elements))))
(define (set-replace-all set elements)
+ ;; TODO: replace with version that only crawls the tree once.
(let ((cmp (set-element-comparator set)))
(fold (lambda (new set)
(update cmp