equal function

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

Implementation

EvaluateExprOutput equal(Path path, Value l, Value r) {
  final falseValue =
      EvaluateExprOutput(value: Value(type: Type.TYPE_BOOL, bool_2: false));
  final trueValue =
      EvaluateExprOutput(value: Value(type: Type.TYPE_BOOL, bool_2: true));
  if (l.type != r.type) {
    return falseValue;
  }
  switch (l.type) {
    case Type.TYPE_NUM:
      return EvaluateExprOutput(
          value: Value(type: Type.TYPE_BOOL, bool_2: l.num == r.num));
    case Type.TYPE_BOOL:
      return EvaluateExprOutput(
          value: Value(type: Type.TYPE_BOOL, bool_2: l.bool_2 == r.bool_2));
    case Type.TYPE_STR:
      return EvaluateExprOutput(
          value: Value(type: Type.TYPE_BOOL, bool_2: l.str == r.str));
    case Type.TYPE_ARR:
      if (l.arr.length != r.arr.length) {
        return falseValue;
      }
      for (final (i, v) in l.arr.indexed) {
        final eq = equal(path, v, r.arr[i]);
        if (eq.value.bool_2 == false) {
          return falseValue;
        }
      }
      return trueValue;
    case Type.TYPE_OBJ:
      final lk = l.obj.keys.toList()..sort();
      final rk = r.obj.keys.toList()..sort();
      if (!ListEquality().equals(lk, rk)) {
        return falseValue;
      }
      for (final k in lk) {
        final eq = equal(path, l.obj[k]!, r.obj[k]!);
        if (eq.value.bool_2 == false) {
          return falseValue;
        }
      }
      return trueValue;
    default:
      return _errorUnexpectedType(
          path,
          [
            Type.TYPE_NUM,
            Type.TYPE_BOOL,
            Type.TYPE_STR,
            Type.TYPE_ARR,
            Type.TYPE_OBJ
          ],
          l.type);
  }
}