1;;;
2;;; srfi-162 - comparator sublibraries
3;;;
4
5;; This is an addition to srfi-128.
6
7(define-module srfi-162
8  (export comparator-min comparator-max
9          comparator-min-in-list comparator-max-in-list
10
11          ;; The followings are built-in.
12          default-comparator
13          boolean-comparator
14          real-comparator
15          char-comparator
16          char-ci-comparator
17          string-comparator
18          string-ci-comparator
19          pair-comparator
20          list-comparator
21          vector-comparator
22          eq-comparator
23          eqv-comparator
24          equal-comparator))
25(select-module srfi-162)
26
27(define (comparator-min-in-list cmpr lis)
28  (assume (not (null? lis)))
29  (let loop ([r (car lis)] [xs (cdr lis)])
30    (cond [(null? xs) r]
31          [(<? cmpr (car xs) r) (loop (car xs) (cdr xs))]
32          [else (loop r (cdr xs))])))
33
34(define (comparator-max-in-list cmpr lis)
35  (assume (not (null? lis)))
36  (let loop ([r (car lis)] [xs (cdr lis)])
37    (cond [(null? xs) r]
38          [(>? cmpr (car xs) r) (loop (car xs) (cdr xs))]
39          [else (loop r (cdr xs))])))
40
41(define (comparator-min cmpr x . xs)
42  (comparator-min-in-list cmpr (cons x xs)))
43
44(define (comparator-max cmpr x . xs)
45  (comparator-max-in-list cmpr (cons x xs)))
46
47
48
49