List diff()

in lib/src/diff_alg.dart [27:61]


List<DiffItem> diff(InfoHelper before, InfoHelper after) {
  List<DiffItem> changedElements = <DiffItem>[];
  for (String path in before.joinedPaths) {
    String beforeId = before.idFromJoinedPath(path);
    int beforeSize = before.sizeOf(beforeId);
    if (beforeSize == null) continue;
    if (after.idFromJoinedPath(path) != null) {
      String afterId = after.idFromJoinedPath(path);
      int afterSize = after.sizeOf(afterId);
      if (afterSize == null) continue;
      int diff = afterSize - beforeSize;
      if (diff == 0) {
        continue;
      } else if (diff > 0) {
        changedElements.add(new DiffItem('partial-add', path, diff));
      } else {
        changedElements.add(new DiffItem('partial-remove', path, diff));
      }
    } else {
      changedElements.add(new DiffItem("full-remove", path, -beforeSize));
    }
  }

  for (String path in after.joinedPaths) {
    String afterId = after.idFromJoinedPath(path);
    int afterSize = after.sizeOf(afterId);
    if (afterSize == null) continue;
    if (before.idFromJoinedPath(path) == null) {
      changedElements.add(new DiffItem("full-add", path, afterSize));
    }
  }

  changedElements.sort((a, b) => -a.diff.abs().compareTo(b.diff.abs()));
  return changedElements;
}