This avoid a double iteration and this open the way to a better handing of
deletion. That better handling of deletion is the core reason we are doing this
I'd rather use a if let (None, None) = (&base_p1_copies, &base_p2_copies) , but it's not a big deal.
This is let mut p1_copies = base_p1_copies.clone();
Looks like you're doing a clone that isn't needed unless we're in the ::Removed case and then unwrapping.