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