// if x more specific than y then return -1 public int Compare(LambdaSignature x, LambdaSignature y) { if (x.RequiredArgsCount > y.RequiredArgsCount) { // more arguments is more specific return(-1); } if (x.RequiredArgsCount < y.RequiredArgsCount) { // more arguments is more specific return(1); } for (var i = 0; i < x.RequiredArgsCount; ++i) { var type1 = x.Parameters[i].Specializer; var type2 = y.Parameters[i].Specializer; var result = Runtime.CompareClass(type1, type2); switch (result) { case CompareClassResult.NotComparable: { // implies both are not null // anything will do but the value must be reproducible. return(Runtime.Compare(type1.GetHashCode(), type2.GetHashCode())); } case CompareClassResult.Less: { // more specific must be on top return(-1); } case CompareClassResult.Greater: { // less specific must be on bottom return(1); } //case CompareClassResult.Equal: default: { // next slot break; } } } return(0); }
object IApply.Apply(object[] args) { return(Runtime.Compare(args[0], args[1])); }