forTree static method

  1. @visibleForTesting
TreeDiff forTree({
  1. required TreeNode oldTree,
  2. required TreeNode newTree,
})

Implementation

@visibleForTesting
static TreeDiff forTree(
    {required TreeNode oldTree, required TreeNode newTree}) {
  final oldKeys = oldTree.children.keys.toSet();
  final newKeys = newTree.children.keys.toSet();

  final nodesAdded = newKeys.difference(oldKeys).map((nodeKey) {
    final node = newTree.children[nodeKey];
    return node == null ? null : NodeAdd(node);
  }).filterNotNull();

  final nodesRemoved = oldKeys.difference(newKeys).map((nodeKey) {
    final node = oldTree.children[nodeKey];
    return node == null ? null : NodeRemove(data: node);
  }).filterNotNull();

  final nodesUnchanged = <Tuple2<TreeNode, TreeNode>>[];
  final nodesUpdated = <NodeUpdate>[];

  for (final nodeKey in oldKeys.intersection(newKeys)) {
    if ((oldTree.children[nodeKey]! as TreeNode).data !=
        (newTree.children[nodeKey]! as TreeNode).data) {
      nodesUpdated.add(NodeUpdate(newTree.children[nodeKey]!));
    }

    nodesUnchanged.add(Tuple2<TreeNode, TreeNode>(
      oldTree.children[nodeKey]! as TreeNode,
      newTree.children[nodeKey]! as TreeNode,
    ));
  }

  return TreeDiff._(
    oldTree: oldTree,
    newTree: newTree,
    nodesAdded: nodesAdded,
    nodesRemoved: nodesRemoved,
    nodesUnchanged: nodesUnchanged,
    nodesUpdated: nodesUpdated,
  );
}