deepEquals static method

bool deepEquals(
  1. Object a,
  2. Object? b
)

Implementation

static bool deepEquals(Object a, Object? b) {
  if (identical(a, b))
    return true;

  if (b == null || b.runtimeType != a.runtimeType)
    return false;

  final typeDescriptor = TypeDescriptor.forType(a.runtimeType);

  for (final field in typeDescriptor.getFields()) {
    final valueA = field.getter(a);
    final valueB = field.getter(b);

    if ( field.type.runtimeType == ObjectType ) {
      if (!deepEquals(valueA, valueB))
        return false;
    }
    else if (field.type.runtimeType == ListType) {
      final listA = valueA as List?;
      final listB = valueB as List?;
      if (listA == null || listB == null) {
        if (listA != listB) return false;
        continue;
      }
      if (listA.length != listB.length) return false;
      for (var i = 0; i < listA.length; ++i) {
        if (!deepEquals(listA[i], listB[i])) return false;
      }
    }
    else if (valueA is Map && valueB is Map) {
      if (valueA.length != valueB.length) return false;
      for (final key in valueA.keys) {
        if (!valueB.containsKey(key)) return false;
        if (!deepEquals(valueA[key], valueB[key])) return false;
      }
    }
    else if (valueA is Set && valueB is Set) {
      if (valueA.length != valueB.length) return false;
      // Both must contain the same elements (unordered)
      for (final entry in valueA) {
        // Use `any` with deepEquals to handle nested set elements
        if (!valueB.any((b) => deepEquals(entry, b))) return false;
      }
    }
    else {
      if (valueA != valueB)
        return false;
    }
  }

  return true;
}