public Transformer andThen()

in model/src/main/java/jetbrains/jetpad/model/transform/BaseTransformer.java [20:59]


  public <ParameterTargetT> Transformer<SourceT, ParameterTargetT> andThen(
      final Transformer<TargetT, ParameterTargetT> transformer) {
    final Transformer<SourceT, TargetT> firstTransformer = this;
    return new BaseTransformer<SourceT, ParameterTargetT>() {
      @Override
      public Transformation<SourceT, ParameterTargetT> transform(SourceT source) {
        Transformation<SourceT, TargetT> tn1 = firstTransformer.transform(source);
        Transformation<TargetT, ParameterTargetT> tn2 = transformer.transform(tn1.getTarget());
        return createTransformation(tn1, tn2);
      }

      @Override
      public Transformation<SourceT, ParameterTargetT> transform(SourceT source, ParameterTargetT to) {
        Transformation<SourceT, TargetT> tn1 = firstTransformer.transform(source);
        Transformation<TargetT, ParameterTargetT> tn2 = transformer.transform(tn1.getTarget(), to);
        return createTransformation(tn1, tn2);
      }

      private Transformation<SourceT, ParameterTargetT> createTransformation(
          final Transformation<SourceT, TargetT> tn1, final Transformation<TargetT, ParameterTargetT> tn2) {
        return new Transformation<SourceT, ParameterTargetT>() {
          @Override
          public SourceT getSource() {
            return tn1.getSource();
          }

          @Override
          public ParameterTargetT getTarget() {
            return tn2.getTarget();
          }

          @Override
          protected void doDispose() {
            tn1.dispose();
            tn2.dispose();
          }
        };
      }
    };
  }