Equality predicate optional, start testing.

This commit is contained in:
Dominik Pantůček 2023-04-07 22:36:48 +02:00
parent 6873a5b7ea
commit b5c705d59f

View file

@ -31,22 +31,28 @@
TAG-LSET
make-lset
lset-add
lset-remove
lset-empty?
lset-member?
lset-add
lset-remove
list->lset
lset->list
lset-merge
lset-intersect
lset-subtract
lset-tests!
)
(import scheme
(chicken string)
(chicken random))
(chicken random)
testing)
;; Tag used for identifying list sets from this module
(define TAG-LSET
@ -64,15 +70,22 @@
""))
;; Creates new list set using given equality procedure
(define (make-lset equality?)
(list TAG-LSET
(list equality?)))
(define (make-lset . equality?)
(let ((equality? (if (null? equality?)
equal?
(car equality?))))
(list TAG-LSET
(list equality?))))
;; Convenience accessors
(define lset-meta cadr)
(define lset-equality? caadr)
(define lset-list cddr)
;; Returns true if the list set is empty
(define (lset-empty? ls)
(null? (lset-list ls)))
;; Returns true if given element is in the list
(define (lset-member? ls el)
(let ((equality? (lset-equality? ls)))
@ -155,20 +168,14 @@
(loop (cdr lst)
(lset-remove ls (car lst))))))
;; Module self-tests
(define (lset-tests!)
(run-tests
lset
(test-true make-lset/lset-empty? (lset-empty? (make-lset)))
))
)
(import util-set-list)
(print TAG-LSET)
(print (make-lset string=?))
(define ls (make-lset string=?))
(print ls)
(define ls1 (lset-add ls "a"))
(print ls1)
(define ls2 (lset-add ls1 "a"))
(print ls2)
(define ls3 (lset-add ls2 "b"))
(print ls3)
(define ls4 (lset-remove ls3 "a"))
(print ls4)
(print (list->lset '("asdf" "qwer" "asdf" "xcvv" "asdf" "qwer" "lkjh") string=?))
(lset-tests!)