compare function

EvaluateExprOutput compare(
  1. Path path,
  2. Value l,
  3. Value r
)

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);
  }
}