propertyValuesEqual function
Whether a and b carry the same value, comparing structurally (vectors
by components, lists and maps element-wise, refs by id).
Implementation
bool propertyValuesEqual(PropertyValue? a, PropertyValue? b) {
if (identical(a, b)) return true;
if (a == null || b == null) return false;
return switch (a) {
BoolValue(:final value) => b is BoolValue && b.value == value,
IntValue(:final value) => b is IntValue && b.value == value,
DoubleValue(:final value) => b is DoubleValue && b.value == value,
StringValue(:final value) => b is StringValue && b.value == value,
Vec2Value(:final value) => b is Vec2Value && _vec2(value, b.value),
Vec3Value(:final value) => b is Vec3Value && _vec3(value, b.value),
Vec4Value(:final value) => b is Vec4Value && _vec4(value, b.value),
QuaternionValue(:final value) =>
b is QuaternionValue && _quat(value, b.value),
Matrix4Value(:final value) => b is Matrix4Value && _mat4(value, b.value),
ColorValue() =>
b is ColorValue && a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a,
ResourceRefValue(:final id) => b is ResourceRefValue && b.id == id,
NodeRefValue(:final id) => b is NodeRefValue && b.id == id,
ListValue(:final values) => b is ListValue && _list(values, b.values),
MapValue(:final values) => b is MapValue && _map(values, b.values),
};
}