isEqualsDeep function

bool isEqualsDeep(
  1. Object? o1,
  2. Object? o2, {
  3. ValueEquality? valueEquality,
})

Returns true if o1 and o2 are equals deeply.

Implementation

bool isEqualsDeep(Object? o1, Object? o2, {ValueEquality? valueEquality}) {
  if (identical(o1, o2)) return true;

  if (o1 == null) return o2 == null;
  if (o2 == null) return false;

  if (o1 is List) {
    if (o2 is List) {
      return isEqualsListDeep(o1, o2, valueEquality: valueEquality);
    } else if (o2 is EntityReferenceList) {
      return isEqualsListDeep(o1, o2.entities, valueEquality: valueEquality);
    }
    return false;
  } else if (o1 is Map) {
    if (o2 is Map) {
      return isEqualsMapDeep(o1, o2, valueEquality: valueEquality);
    }
    return false;
  } else if (o1 is Set) {
    if (o2 is Set) {
      return isEqualsSetDeep(o1, o2, valueEquality: valueEquality);
    }
    return false;
  } else if (o1 is Iterable) {
    if (o2 is Iterable) {
      return isEqualsIterableDeep(o1, o2, valueEquality: valueEquality);
    } else if (o2 is EntityReferenceList) {
      return isEqualsIterableDeep(o1, o2.entities,
          valueEquality: valueEquality);
    }
    return false;
  } else if (o1 is EntityReferenceList) {
    if (o2 is EntityReferenceList) {
      return o1 == o2;
    } else if (o2 is Iterable) {
      return isEqualsIterableDeep(o1.entities, o2,
          valueEquality: valueEquality);
    }
    return false;
  }

  if (valueEquality != null) {
    return valueEquality(o1, o2);
  } else {
    return o1 == o2;
  }
}