1    type Ordering =
2        | Less
3        | Equal
4        | Greater
5    
6    class Compare =
7        def compare (other : Self) : Ordering
8    
9        def (>) (rhs : Self) =
10           let result = compare rhs
11           result == Ordering/Greater
12   
13       def (>=) (rhs : Self) =
14           let result = compare rhs
15           result <> Ordering/Less
16   
17       def (<) (rhs : Self) =
18           let result = compare rhs
19           result == Ordering/Less
20   
21       def (<=) (rhs : Self) =
22           let result = compare rhs
23           result <> Ordering/Greater
24   
25       is Comparable
26   
27   type (T1, T2) u v where T1 : Comparable
28                           T2 : Comparable
29       def compare (other : Self) = when
30           u > other.u -> Ordering/Greater
31           u < other.u -> Ordering/Less
32           v > other.v -> Ordering/Greater
33           v < other.v -> Ordering/Less
34           else -> Ordering/Equal
35   
36       is Compare
37   
38   type String
39       def compare (other : String) : Ordering =
40           let min_length = length.min other.length
41           for i = 0 until min_length do
42               let l = self[i]
43               let r = other[i]
44               if l > r then
45                   return Ordering/Greater
46               else if l < r then
47                   return Ordering/Less
48           when
49               length > other.length -> Ordering/Greater
50               length < other.length -> Ordering/Less
51               else -> Ordering/Equal
52   
53       is Compare
54