summaryrefslogtreecommitdiffstats
path: root/srfi/srfi-228.scm
diff options
context:
space:
mode:
authorGravatar Daphne Preston-Kendal 2022-11-26 13:00:05 +0100
committerGravatar Daphne Preston-Kendal 2022-11-26 13:00:05 +0100
commitc25e65bae96d6d5c26b0d9e8af96e8dcdbdaf99f (patch)
treec267d5839f1e3b77d8c903952dd573ffeae1cb31 /srfi/srfi-228.scm
parentSpecify base cases and behaviours of each comparator function (diff)
parentPublish third draft. (diff)
Merge branch 'master' of https://github.com/scheme-requests-for-implementation/srfi-228
Diffstat (limited to 'srfi/srfi-228.scm')
-rw-r--r--srfi/srfi-228.scm90
1 files changed, 90 insertions, 0 deletions
diff --git a/srfi/srfi-228.scm b/srfi/srfi-228.scm
new file mode 100644
index 0000000..caca339
--- /dev/null
+++ b/srfi/srfi-228.scm
@@ -0,0 +1,90 @@
+(define (make-wrapper-comparator type-test unwrap contents-comparator)
+ (make-comparator
+ type-test
+ (lambda (a b)
+ ((comparator-equality-predicate contents-comparator)
+ (unwrap a)
+ (unwrap b)))
+ (if (comparator-ordering-predicate contents-comparator)
+ (lambda (a b)
+ ((comparator-ordering-predicate contents-comparator)
+ (unwrap a)
+ (unwrap b)))
+ #f)
+ (if (comparator-hash-function contents-comparator)
+ (lambda (x)
+ ((comparator-hash-function contents-comparator) x))
+ #f)))
+
+(define (make-product-comparator . comparators)
+ (let* ((type-tests
+ (delete-duplicates
+ (map comparator-type-test-predicate comparators)
+ eq?))
+ (type-test
+ (lambda (val)
+ (every (lambda (test) (test val)) type-tests))))
+ (make-comparator
+ type-test
+ (lambda (a b)
+ (every (lambda (cmp)
+ ((comparator-equality-predicate cmp) a b))
+ comparators))
+ (if (every comparator-ordered? comparators)
+ (lambda (a b)
+ (let loop ((cmps comparators))
+ (cond ((null? cmps) #f)
+ (((comparator-ordering-predicate (car cmps)) a b) #t)
+ (((comparator-equality-predicate (car cmps)) a b) (loop (cdr cmps)))
+ (else #f))))
+ #f)
+ (if (every comparator-hashable? comparators)
+ (lambda (x)
+ (fold bitwise-xor
+ 0
+ (map (lambda (cmp)
+ ((comparator-hash-function cmp) x))
+ comparators)))
+ #f))))
+
+(define (%sum-comparator-for comparators a b)
+ (define (type-tests-for? x)
+ (lambda (cmp) ((comparator-type-test-predicate cmp) x)))
+ (let ((a-cmp (find-tail (type-tests-for? a) comparators)))
+ (if (and a-cmp ((comparator-type-test-predicate (car a-cmp)) b))
+ a-cmp
+ (let ((b-cmp (find-tail (type-tests-for? a) comparators)))
+ (if (and b-cmp ((comparator-type-test-predicate (car b-cmp)) a))
+ b-cmp
+ #f)))))
+
+(define (make-sum-comparator . comparators)
+ (make-comparator
+ (lambda (x)
+ (any
+ (lambda (cmp)
+ ((comparator-type-test-predicate cmp) x))
+ comparators))
+ (lambda (a b)
+ (let ((cmp (%sum-comparator-for comparators a b)))
+ (if cmp
+ ((comparator-equality-predicate (car cmp)) a b)
+ #f)))
+ (if (every comparator-ordered? comparators)
+ (lambda (a b)
+ (let ((cmp (%sum-comparator-for comparators a b)))
+ (if cmp
+ ((comparator-ordering-predicate (car cmp)) a b)
+ (let ((a-cmp (%sum-comparator-for comparators a a))
+ (b-cmp (%sum-comparator-for comparators b b)))
+ (>= (length a-cmp) (length b-cmp))))))
+ #f)
+ (if (every comparator-hashable? comparators)
+ (lambda (x)
+ (let ((cmp (%sum-comparator-for comparators x x)))
+ ((comparator-hash-function (car cmp)) x)))
+ #f)))
+<<<<<<<< HEAD:srfi/composing-comparators.scm
+
+========
+>>>>>>>> 58c55b3dfe6ebdfd8770cd69ac08acda24dc4f50:srfi/srfi-228.scm