compare function
Implementation
EvaluateExprOutput compare(Path path, Value l, Value r) {
final ltValue =
EvaluateExprOutput(value: Value(type: Type.TYPE_NUM, num: -1));
final gtValue = EvaluateExprOutput(value: Value(type: Type.TYPE_NUM, num: 1));
final eqValue = EvaluateExprOutput(value: Value(type: Type.TYPE_NUM, num: 0));
switch ((l.type, r.type)) {
case (Type.TYPE_NUM, Type.TYPE_NUM):
if (l.num < r.num) {
return ltValue;
}
if (l.num > r.num) {
return gtValue;
}
return eqValue;
case (Type.TYPE_BOOL, Type.TYPE_BOOL):
if (!l.bool_2 && r.bool_2) {
return ltValue;
}
if (l.bool_2 && !r.bool_2) {
return gtValue;
}
return eqValue;
case (Type.TYPE_STR, Type.TYPE_STR):
if (l.str.compareTo(r.str) < 0) {
return ltValue;
}
if (l.str.compareTo(r.str) > 0) {
return gtValue;
}
return eqValue;
case (Type.TYPE_ARR, Type.TYPE_ARR):
final n = min(l.arr.length, r.arr.length);
for (var i = 0; i < n; i++) {
final cmp = compare(path, l.arr[i], r.arr[i]);
if (cmp.status != EvaluateExprOutput_Status.OK) {
return cmp;
}
if (cmp.value.num != 0) {
return cmp;
}
}
if (l.arr.length < r.arr.length) {
return ltValue;
}
if (l.arr.length > r.arr.length) {
return gtValue;
}
return eqValue;
default:
return _errorUnexpectedType(
path,
[
Type.TYPE_NUM,
Type.TYPE_BOOL,
Type.TYPE_STR,
Type.TYPE_ARR,
Type.TYPE_OBJ
],
l.type);
}
}