diff options
| author | 2021-12-29 18:24:38 +0100 | |
|---|---|---|
| committer | 2021-12-29 18:24:38 +0100 | |
| commit | af21fcb5e6dd976599653e28c407cf34abaa9819 (patch) | |
| tree | c81cc7f4562c1594a9f6e7844396d3517bfa6022 /composing-comparators.scm | |
| parent | Nix compose-comparator syntax, rename composed to product comparator (diff) | |
Add make-sum-comparator and use the term ‘product comparator’ more
Diffstat (limited to 'composing-comparators.scm')
| -rw-r--r-- | composing-comparators.scm | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/composing-comparators.scm b/composing-comparators.scm index 3356797..89678d0 100644 --- a/composing-comparators.scm +++ b/composing-comparators.scm @@ -43,6 +43,41 @@ (list->generator comparators)))) #f))) +(define (make-sum-comparator . comparators) + (make-comparator + (lambda (x) + (any (lambda (cmp) ((comparator-type-test cmp) x)) comparators)) + (if (every comparator-equality-predicate comparators) + (lambda (a b) + (let ((a-cmp-idx (list-index + (lambda (cmp) ((comparator-type-test cmp) a)) + comparators)) + (b-cmp-idx (list-index + (lambda (cmp) ((comparator-type-test cmp) b)) + comparators)))) + (if (not (= a-cmp-idx b-cmp-idx) #f) + (let ((cmp (list-ref comparators a-cmp-idx))) + ((comparator-equality-predicate cmp) a b)))) + #f) + (if (every comparator-ordering-predicate comparators) + (lambda (a b) + (let ((a-cmp-idx (list-index + (lambda (cmp) ((comparator-type-test cmp) a)) + comparators)) + (b-cmp-idx (list-index + (lambda (cmp) ((comparator-type-test cmp) b)) + comparators))) + (cond ((< a-cmp-idx b-cmp-idx) #t) + ((> a-cmp-idx b-cmp-idx) #f) + (else + (let ((cmp (list-ref comparators a-cmp-idx))) + ((comparator-ordering-predicate cmp) a b)))))) + #f) + (if (every comparator-hash-function comparators) + (lambda (x) + (let ((cmp (find (lambda (cmp) ((comparator-type-test cmp) x)) comparators))) + ((comparator-hash-function cmp) x)))))) + (define (comparison-procedures comparator) (values (lambda args (apply <? comparator args)) |
