"Abstraction of ordinal types, that is, types with 
 successor and predecessor operations, including
 `Integer` and other `Integral` numeric types.
 `Character` is also considered an ordinal type. 
 `Ordinal` types may be used to generate a `Range`."
see (`class Character`, 
     `class Integer`, 
     `interface Integral`, 
     `class Range`)
by ("Gavin")
shared interface Ordinal<out Other> of Other
        given Other satisfies Ordinal<Other> {
    
    "The successor of this value."
    shared formal Other successor;
    
    "The predecessor of this value."
    shared formal Other predecessor;
    
}

"Abstraction of ordinal types whose instances can be 
 mapped to the integers or to a range of integers."
shared interface Enumerable<out Other> of Other
        satisfies Ordinal<Other> 
        given Other satisfies Enumerable<Other> {
        
    "The corresponding integer. The implementation must
     satisfy these constraints:
    
         (x.successor).integerValue = x.integerValue+1
         (x.predecessor).integerValue = x.integerValue-1
     
     for every instance `x` of the enumerable type."
    shared formal Integer integerValue;
    
}