Compile new lset.

This commit is contained in:
Dominik Pantůček 2023-07-07 12:50:14 +02:00
parent 04aa18d449
commit 684cc7d7f8
3 changed files with 77 additions and 1 deletions

65
src/util-bst-lset.scm Normal file
View file

@ -0,0 +1,65 @@
(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 lset-remove ls1 (lset->list ls2)))
)