bool notNull(Object? any) { return any != null; } Map? _recursivelyAddAll( Map? target, Map? source, ) { target = Map.from(target ?? {}); source?.forEach((String key, dynamic value) { if (target!.containsKey(key) && target[key] is Map && value != null && value is Map) { target[key] = _recursivelyAddAll( target[key] as Map, value, ); } else { // Lists and nulls overwrite target as if they were normal scalars target[key] = value; } }); return target; } /// Deeply merges `maps` into a new map, merging nested maps recursively. /// /// Paths in the rightmost maps override those in the earlier ones, so: /// ``` /// print(deeplyMergeLeft([ /// {'keyA': 'a1'}, /// {'keyA': 'a2', 'keyB': 'b2'}, /// {'keyB': 'b3'} /// ])); /// // { keyA: a2, keyB: b3 } /// ``` /// /// Conflicting [List]s are overwritten like scalars Map? deeplyMergeLeft( Iterable?> maps, ) { // prepend an empty literal for functional immutability return (?>[{}]..addAll(maps)).reduce(_recursivelyAddAll); }