in model/src/main/java/jetbrains/jetpad/model/transform/BaseFilterTransformer.java [48:118]
public Transformation<CollectionS, CollectionT> transform(final CollectionS from, final CollectionT to) {
return new Transformation<CollectionS, CollectionT>() {
private Map<ItemT, Registration> myPropertyRegistrations = new HashMap<>();
private Registration myCollectionRegistration;
{
for (ItemT item : from) {
boolean shouldAdd = watch(item);
if (shouldAdd) {
to.add(item);
}
}
myCollectionRegistration = from.addListener(new CollectionAdapter<ItemT>() {
@Override
public void onItemAdded(CollectionItemEvent<? extends ItemT> event) {
ItemT item = event.getNewItem();
boolean shouldAdd = watch(item);
if (shouldAdd) {
add(item, from, to);
}
}
@Override
public void onItemRemoved(CollectionItemEvent<? extends ItemT> event) {
ItemT item = event.getOldItem();
unwatch(item);
to.remove(item);
}
});
}
private boolean watch(final ItemT item) {
ReadableProperty<Boolean> property = myFilterBy.apply(item);
myPropertyRegistrations.put(item, property.addHandler(new EventHandler<PropertyChangeEvent<Boolean>>() {
@Override
public void onEvent(PropertyChangeEvent<Boolean> event) {
if (event.getNewValue()) {
add(item, from, to);
} else {
to.remove(item);
}
}
}));
Boolean value = property.get();
return value != null && value;
}
private void unwatch(ItemT item) {
myPropertyRegistrations.remove(item).remove();
}
@Override
public CollectionS getSource() {
return from;
}
@Override
public CollectionT getTarget() {
return to;
}
@Override
protected void doDispose() {
myCollectionRegistration.remove();
for (ItemT item : from) {
unwatch(item);
}
}
};
}