cómo escribir una función de comparación genérica en Haxe (haxe3)

Estoy tratando de escribir una función de comparación genérica (como la c strcmp) en Haxe3 para un tipo de plantilla A, suponiendo que este tipo de plantilla tiene un operador "<=" menor o igual que.

Lo vi en la documentación de Haxe3 (http://haxe.org/manual/haxe3/features) que puede hacer un trabajo similar si quiere asumir que un tipo de plantilla tiene la nueva función:

@:generic static function foo<T:{function new(s:String):Void;}>(t:T) {
    trace(Type.typeof(t)); // TClass([class String]) / TClass([class Template])
    return new T("foo");
}

Entonces, probé la misma técnica con una función "le":

class Main {
    @:generic static public function compare_<A:{function le(y:A):Bool;}>(x:A,y:A): Int {
        if (x.le(y) && y.le(x)) return 0;
        else if (x.le(y)) return -1;
        else return 1;
    }


    static function main() {
        var a:MyInt  = new MyInt(1);
        var b:MyInt  = new MyInt(2);
        trace(compare_(a,b));
    }
}

class MyInt {
    var data:Int;
    public function new(i:Int) {this.data = i; }
    public function le(y:MyInt){return data <= y.data;}
}

La función compare_ anterior funciona bien para cualquier tipo con la función de "le" como requisito previo. El código anterior devuelve -1 como se esperaba. Pero es bastante inconveniente, obviamente, crear una nueva clase para Int, solo para proporcionar lale función. Mi pregunta es, ¿hay una manera de volver a escribir la función compare_ para que funcione con cualquier tipo de plantilla (Int, Float, otros tipos con operadores sobrecargados) con un operador "<=" definido?

Lo siguiente es lo que he intentado:

@:generic static public function compare_<A:{@:op(X <= Y) function le(x:A,y:A):Bool;}>(x:A,y:A): Int {
     if (x <= y && y <= x) return 0;
     else if (x <= y) return -1;
     else return 1;
 }

que por supuesto no compila. Haxe se queja de que "le" no está definido.

Estoy buscando soluciones livianas sin involucrar macros, ya que pretendo reutilizar el código generado por haxe en otros idiomas sin depender de Boot. o scuts. La dinámica tampoco es buena para mis propósitos, ya que no existe ningún tipo de seguridad.

Gracias por adelantado.

Actualización: Hice una lectura adicional y pensé que podría inyectar unle Método de la manera difícil en cada tipo que quiero, utilizando elusing ycallback mecanismo. Por favor vea mi pregunta relacionada en eso"la importación y el uso pueden no aparecer después de una declaración de tipo" - el haxe usando magic.

Respuestas a la pregunta(1)

Su respuesta a la pregunta