package jazz.lang;
///////////////////////////////////////////////////////////////////////////////
//
// Comparable types
//
///////////////////////////////////////////////////////////////////////////////
public interface Comparable {
public static sort<T: Comparable>(v: T[]): T[];
}
///////////////////////////////////////////////////////////////////////////////
//
// Implementation
//
///////////////////////////////////////////////////////////////////////////////
// Merge sort implementation of the "sort" function
Comparable.sort<T>(v) = sort(v.length)(v): T[v.length] {
fun sort(n)(v) = v'
{
if (n < 2) {
v' = v;
} else {
m = n div 2;
v' = merge(m)(sort(m)(v))(n-m)(sort(n-m)(v[m..n-1]));
}
}
fun merge(n1)(v1)(n2)(v2) = v
{
if (n1 == 0) {
v = v2;
} else if (n2 == 0) {
v = v1;
} else if (v1[0] < v2[0]) {
v[0] = v1[0];
v[1..] = merge(n1-1)(v1[1..])(n2)(v2);
} else {
v[0] = v2[0];
v[1..] = merge(n1)(v1)(n2-1)(v2[1..]);
}
}
}