ShadowViewMutationList calculateShadowViewMutations(
  const ShadowNode &oldRootShadowNode,
  const ShadowNode &newRootShadowNode
) {
  // Root shadow nodes must have same tag.
  assert(oldRootShadowNode.getTag() == newRootShadowNode.getTag());

  ShadowViewMutationList mutations;

  if (oldRootShadowNode != newRootShadowNode) {
    mutations.push_back(
      ShadowViewMutation::UpdateMutation(
        ShadowView(),
        ShadowView(oldRootShadowNode),
        ShadowView(newRootShadowNode),
        -1
      )
    );
  }

  calculateShadowViewMutations(
    mutations,
    ShadowView(oldRootShadowNode),
    sliceChildShadowNodeViewPairs(oldRootShadowNode),
    sliceChildShadowNodeViewPairs(newRootShadowNode)
  );

  return mutations;
}
ShadowView::ShadowView(const ShadowNode &shadowNode):
  componentName(shadowNode.getComponentName()),
  componentHandle(shadowNode.getComponentHandle()),
  tag(shadowNode.getTag()),
  props(shadowNode.getProps()),
  eventEmitter(shadowNode.getEventEmitter()),
  layoutMetrics(layoutMetricsFromShadowNode(shadowNode)),
  localData(shadowNode.getLocalData()) {}