forTree static method
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,
);
}