diff --git a/src/Makefile b/src/Makefile index d2c9e11..a09ff54 100644 --- a/src/Makefile +++ b/src/Makefile @@ -56,7 +56,7 @@ HACKERBASE-OBJS=hackerbase.o testing.o listing.o cal-month.o \ util-utf8.o sgr-cell.o template-list-expander.o \ box-drawing.o util-list.o export-web-static.o util-dir.o \ dokuwiki.o racket-kwargs.o duck.o util-bst.o \ - util-bst-bdict.o util-bst-ldict.o + util-bst-bdict.o util-bst-ldict.o util-bst-lset.o GENDOC-SOURCES=gendoc.scm duck-extract.import.scm \ util-time.import.scm util-csv.import.scm util-git.import.scm \ @@ -526,3 +526,10 @@ UTIL-BST-LDICT-SOURCES=util-bst-ldict.scm duck.import.scm \ util-bst-ldict.o: util-bst-ldict.import.scm util-bst-ldict.import.scm: $(UTIL-BST-LDICT-SOURCES) + +UTIL-BST-LSET-SOURCES=util-bst-lset.scm util-bst.import.scm \ + racket-kwargs.import.scm util-bst-ldict.import.scm \ + util-list.import.scm + +util-bst-lset.o: util-bst-lset.import.scm +util-bst-lset.import.scm: $(UTIL-BST-LSET-SOURCES) diff --git a/src/util-bst-lset.scm b/src/util-bst-lset.scm new file mode 100644 index 0000000..0a255d1 --- /dev/null +++ b/src/util-bst-lset.scm @@ -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? ldictlset 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))) + + ) diff --git a/src/util-bst.scm b/src/util-bst.scm index 7a16475..93f97a7 100644 --- a/src/util-bst.scm +++ b/src/util-bst.scm @@ -10,6 +10,10 @@ make-bst bst? + bst-EQ? + + bst-count + bst-empty? bst-ref bst-contains?