hackerbase/src/util-bst-lset.scm

91 lines
2 KiB
Scheme

;;
;; util-bst-lset.scm
;;
;; BST-based set implementation.
;;
;; ISC License
;;
;; Copyright 2023 Brmlab, z.s.
;; Dominik Pantůček <dominik.pantucek@trustica.cz>
;;
;; Permission to use, copy, modify, and/or distribute this software
;; for any purpose with or without fee is hereby granted, provided
;; that the above copyright notice and this permission notice appear
;; in all copies.
;;
;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
;;
(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
srfi-1)
(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)))
)