aboutsummaryrefslogtreecommitdiffstats
path: root/mcgoron
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2025-02-16 00:05:13 -0500
committerGravatar Peter McGoron 2025-02-16 00:05:13 -0500
commit62506b742c878a0a9648441f6395ecafdad9c06a (patch)
tree3ad0ef210eddad999f05bb5bef32c9cc9f4ab25b /mcgoron
parentstart testing SRFI 113 tests (diff)
tests for different constructors
Diffstat (limited to 'mcgoron')
-rw-r--r--mcgoron/weight-balanced-trees/srfi/113/sets.scm67
1 files changed, 30 insertions, 37 deletions
diff --git a/mcgoron/weight-balanced-trees/srfi/113/sets.scm b/mcgoron/weight-balanced-trees/srfi/113/sets.scm
index d9552db..7c31ece 100644
--- a/mcgoron/weight-balanced-trees/srfi/113/sets.scm
+++ b/mcgoron/weight-balanced-trees/srfi/113/sets.scm
@@ -107,24 +107,21 @@
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; The whole set
-;;;
-;;; Although these functions use generators, they cannot use the
-;;; generator SRFIs, because they might include the false value.
-;;; (this is an example of `false` acting like a null value, except
-;;; in the case of generators, there is no clever getting around it
-;;; like `assoc` or `member`).
-;;;
-;;; Performance note: generators mutate values and hence might not work
-;;; well with write-barrier based systems like Chicken.
;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(define (set-find predicate? set failure)
- (let ((gen (set->generator set)))
- (let loop ((value (gen)))
- (cond
- ((eof-object? value) (failure))
- ((predicate? value) value)
- (else (loop (gen)))))))
+(define set-find
+ (case-lambda
+ ((predicate set default-value)
+ (set-find predicate set default-value (lambda (x) x)))
+ ((predicate set default-value transform)
+ (let loop ((queue (list (get-node set))))
+ (cond
+ ((null? queue) default-value)
+ ((null? (car queue)) (loop (cdr queue)))
+ (else (with-node ((car queue) data ("<" left) (">" right))
+ (if (predicate data)
+ (transform data)
+ (loop (cons* left right (cdr queue)))))))))))
(define (set-count predicate set)
(define (count node)
@@ -136,33 +133,25 @@
(count (get-node set)))
(define (set-any? predicate set)
- (let ((gen (set->generator set)))
- (let loop ((value (gen)))
- (cond
- ((eof-object? value) #f)
- ((predicate value) #t)
- (else (loop (gen)))))))
+ (set-find predicate set (lambda () #f) (lambda (x) #t)))
(define (set-every? predicate set)
- (let ((gen (set->generator set)))
- (let loop ((value (gen)))
- (cond
- ((eof-object? value) #t)
- ((predicate value) (loop (gen)))
- (else #f)))))
+ (set-find (lambda (x) (not (predicate x)))
+ set
+ (lambda () #f)
+ (lambda (x) #t)))
;;; ;;;;;;;;;;;;;;;;;;;;;;;;
;;; Mapping and folding
;;; ;;;;;;;;;;;;;;;;;;;;;;;;
(define (set-map comparator proc old-set)
- (let ((gen (set->generator old-set)))
- (let set-map ((new-node '())
- (value (gen)))
- (if (eof-object? value)
- (raw-set comparator new-node)
- (set-map (insert comparator new-node (proc value))
- (gen))))))
+ (let ((cmp (set-element-comparator old-set)))
+ (raw-set cmp
+ (set-fold (lambda (value new-node)
+ (insert cmp new-node (proc value)))
+ '()
+ old-set))))
(define (set-for-each proc set)
(let loop ((node (get-node set)))
@@ -235,10 +224,14 @@
#;(raw-set (get-element-comparator set) (node-copy node)))
(define (list->set comparator lst)
- (set-unfold comparator null? car cdr lst))
+ (let loop ((node '())
+ (lst lst))
+ (if (null? lst)
+ (raw-set comparator node)
+ (loop (insert comparator node (car lst)) (cdr lst)))))
(define (set->list set)
- (generator->list (set->generator set)))
+ (set-fold cons '() set))
(define (list->set! set elements)
(set-union set (list->set (set-element-comparator set) elements)))