Objective-C deep clone and recursive dictionary merge
Objective-C
#import <Foundation/Foundation.h>
static id DeepClone(id v) {
if ([v isKindOfClass:NSDictionary.class]) {
NSMutableDictionary *out = [NSMutableDictionary dictionary];
for (id k in v) out[k] = DeepClone(((NSDictionary *)v)[k]);
return out;
}
if ([v isKindOfClass:NSArray.class]) {
NSMutableArray *out = [NSMutableArray array];
for (id e in v) [out addObject:DeepClone(e)];
return out;
}
return [v copy];
}
static id DeepMerge(id base, id over) {
if (![base isKindOfClass:NSDictionary.class] || ![over isKindOfClass:NSDictionary.class])
return over ? DeepClone(over) : DeepClone(base);
NSMutableDictionary *out = DeepClone(base);
for (id k in over) out[k] = DeepMerge(out[k], ((NSDictionary *)over)[k]);
return out;
}