hackerbase/src/util-bst-lset.scm

67 lines
1.2 KiB
Scheme

(declare (unit util-bst-lset))
(import duck)
(module*
util-bst-lset
#:doc ("Reimplementation of old lset using new BST backend.")
(
make-lset
lset?
lset-empty?
lset-member?
lset-count
lset-add
lset-remove
list->lset
lset->list
lset-merge
lset-intersect
lset-subtract
lset=?
)
(import scheme
util-bst
racket-kwargs
util-bst-ldict
util-list)
(define* (make-lset (equality? equal?))
(make-bst 'lset equality? ldict<?))
(define lset? (bst? 'lset))
(define lset-empty? bst-empty?)
(define lset-member? bst-contains?)
(define lset-count bst-count)
(define (lset-add ls e)
(bst-set ls e #t))
(define lset-remove bst-remove)
(define* (list->lset lst (equality? equal?))
(foldl lset-add (make-lset equality?) lst))
(define lset->list bst-keys)
(define (lset=? ls1 ls2)
(bst-equal? ls1 ls2))
(define (lset-merge ls1 ls2)
(foldl lset-add ls1 (lset->list ls2)))
(define (lset-intersect ls1 ls2)
(list->lset
(filter (lambda (el)
(lset-member? ls2 el))
(lset->list ls1))
(bst-EQ? ls1)))
(define (lset-subtract ls1 ls2)
(foldl (lambda (ls e)
(lset-remove ls e #t))
ls1 (lset->list ls2)))
)