Dart deep clone and recursive map merge

Dart
import 'dart:convert';

dynamic deepClone(dynamic value) {
  if (value is Map || value is List) {
    return jsonDecode(jsonEncode(value));
  }
  return value;
}

Map<String, dynamic> deepMerge(Map<String, dynamic> base, Map<String, dynamic> patch) {
  final out = deepClone(base) as Map<String, dynamic>;
  for (final entry in patch.entries) {
    final old = out[entry.key];
    final next = entry.value;
    if (old is Map<String, dynamic> && next is Map<String, dynamic>) {
      out[entry.key] = deepMerge(old, next);
    } else {
      out[entry.key] = deepClone(next);
    }
  }
  return out;
}