public void remove(@NotNull Change change) {
   if (change.getType().isApplied()) {
     LOG.assertTrue(myAppliedChanges.remove(change), change);
   } else {
     LOG.assertTrue(myChanges.remove(change), change);
   }
   change.onRemovedFromList();
   fireOnChangeRemoved();
 }
 public void setChanges(@NotNull ArrayList<Change> changes) {
   if (myChanges != null) {
     HashSet<Change> newChanges = new HashSet<>(changes);
     LOG.assertTrue(newChanges.size() == changes.size());
     for (Iterator<Change> iterator = myChanges.iterator(); iterator.hasNext(); ) {
       Change oldChange = iterator.next();
       if (!newChanges.contains(oldChange)) {
         iterator.remove();
         oldChange.onRemovedFromList();
       }
     }
   }
   for (Change change : changes) {
     LOG.assertTrue(change.isValid());
   }
   myChanges = new ArrayList<>(changes);
   myAppliedChanges = new ArrayList<>();
 }