public Transformation transform()

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);
        }
      }
    };
  }