summaryrefslogtreecommitdiffstats
path: root/srfi/composing-comparators.scm
diff options
context:
space:
mode:
authorGravatar Daphne Preston-Kendal 2022-11-26 12:54:03 +0100
committerGravatar Daphne Preston-Kendal 2022-11-26 12:54:03 +0100
commitfa64d7d392230cfa7e2ec52ebb279d9913ccc736 (patch)
tree03c879545fd7f30a0b77ed13302d52d740c3411a /srfi/composing-comparators.scm
parentcopy edit (diff)
Specify base cases and behaviours of each comparator function
Diffstat (limited to 'srfi/composing-comparators.scm')
-rw-r--r--srfi/composing-comparators.scm87
1 files changed, 87 insertions, 0 deletions
diff --git a/srfi/composing-comparators.scm b/srfi/composing-comparators.scm
new file mode 100644
index 0000000..3a93ae4
--- /dev/null
+++ b/srfi/composing-comparators.scm
@@ -0,0 +1,87 @@
+(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)))
+
00'>2003-04-07new_handle_on_port() error path fix from Jim RadfordGravatar dmaas 1-1/+3 2003-03-26add raw1394_new_handle_on_port() convenience functionGravatar dmaas 2-1/+41 2003-02-22Updates for new rawiso ioctl interface.Gravatar bencollins 3-37/+125 2003-01-15add iso_xmit_sync() and iso_xmit_write(); clean up iso handling a bitGravatar dmaas 5-39/+161 2003-01-15implement tag matching for rawiso receptionGravatar dmaas 3-4/+12 2003-01-06back out previous commit - don't drop the legacy API just yetGravatar dmaas 6-173/+130 2003-01-05emulate legacy ISO reception API on top of new rawiso APIGravatar dmaas 7-131/+174 2002-12-24update iso API for multi-channel reception and new packet buffer layoutGravatar dmaas 4-123/+236 2002-12-20oops, irq_interval needs to be signedGravatar anonymous 1-1/+1 2002-12-20dmaas - renamed exported arm definitions into the raw1394_ namespace; brought...Gravatar anonymous 3-124/+48 2002-12-16rawiso updates:Gravatar dmaas 3-18/+25 2002-11-18fix cplusplus extern C blockGravatar ddennedy 1-4/+4 2002-11-18merged rawiso branchGravatar ddennedy 7-6/+488 ar/4fdeb2365dc75bd544972b8cdb7992fd?s=13&d=retro' width='13' height='13' alt='Gravatar' /> aeb 4-2/+16 2000-06-15Update libtool version number.Gravatar aeb 2-2/+2 2000-06-14Added copyright headers.Gravatar aeb 6-0/+54 2000-06-11Added explicit AC_PROG_INSTALL call.Gravatar aeb 1-0/+1 2000-06-09Fix size of error field.Gravatar aeb 1-2/+2 2000-06-02Modified support for 32/64 bit environments, control struct fields have fixed...Gravatar aeb 7-43/+28 2000-05-28Added support for environments with 64 bit kernel and 32 bit userland.Gravatar aeb 8-7/+45 2000-04-27Fixed missing setting of ext code in raw1394_start_lock()Gravatar aeb 1-0/+1 2000-04-15Fixed lock transaction to actually return response value.Gravatar aeb 3-5/+11 2000-04-12Add userdata functions as news.Gravatar aeb 1-0/+4 2000-04-05Add userdata functions.Gravatar aeb 3-0/+18 2000-03-18Bump version number to 0.6.Gravatar aeb 3-5/+6 2000-03-18Mention byte order change.Gravatar aeb 1-0/+2 2000-03-18Mention SourceForge home.Gravatar aeb 1-1/+5