in model/src/main/java/jetbrains/jetpad/model/event/EventSources.java [80:115]
public static <EventT, ItemT> EventSource<EventT> selectList(
final ObservableList<ItemT> list, final Function<ItemT, EventSource<? extends EventT>> selector) {
return new EventSource<EventT>() {
@Override
public Registration addHandler(final EventHandler<? super EventT> handler) {
final List<Registration> itemRegs = new ArrayList<>();
for (ItemT item : list) {
itemRegs.add(selector.apply(item).addHandler(handler));
}
final Registration listReg = list.addListener(new CollectionAdapter<ItemT>() {
@Override
public void onItemAdded(CollectionItemEvent<? extends ItemT> event) {
itemRegs.add(event.getIndex(), selector.apply(event.getNewItem()).addHandler(handler));
}
@Override
public void onItemRemoved(CollectionItemEvent<? extends ItemT> event) {
itemRegs.remove(event.getIndex()).remove();
}
});
return new Registration() {
@Override
protected void doRemove() {
for (Registration r : itemRegs) {
r.remove();
}
listReg.remove();
}
};
}
};
}