merge method

  1. @override
SELF merge(
  1. SELF? other
)
override

Implementation

@override
SELF merge(SELF? other) {
  if (other == null) return this as SELF;
  final structure = _structure;
  final proxy = structure.proxy;
  final selfValues = proxy.getFieldValues(this);
  final otherValues = proxy.getFieldValues(other);
  final values = List.generate(selfValues.length, (i) {
    final selfValue = selfValues[i];
    final otherValue = otherValues[i];
    final field = structure.fields[i];

    if (selfValue == null || otherValue == null) {
      return selfValue ?? otherValue;
    }
    if (selfValue.runtimeType == otherValue.runtimeType) {
      if (selfValue is Mergeable) {
        return selfValue.merge(otherValue);
      }

      final mergeableFunction = field.firstAnnotationOf<MergeFunction>();
      if (mergeableFunction != null) {
        return mergeableFunction.mergeFunction(selfValue, otherValue);
      }

      return selfValue;
    }
    return selfValue;
  });
  return proxy.instantiate(values) as SELF;
}