17f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// Copyright 2017 The Bazel Authors. All rights reserved.
27f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael//
37f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// Licensed under the Apache License, Version 2.0 (the "License");
47f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// you may not use this file except in compliance with the License.
57f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// You may obtain a copy of the License at
67f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael//
77f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael//    http://www.apache.org/licenses/LICENSE-2.0
87f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael//
97f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// Unless required by applicable law or agreed to in writing, software
107f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// distributed under the License is distributed on an "AS IS" BASIS,
117f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// See the License for the specific language governing permissions and
137f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael// limitations under the License.
147f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichaelpackage com.google.devtools.build.android.desugar.testdata.java8;
157f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
167f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichaelimport java.util.List;
177f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichaelimport java.util.function.Function;
187f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichaelimport java.util.stream.Collectors;
197f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
207f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael/** Desugaring test input interface that includes a default method and a static method. */
217f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichaelpublic interface FunctionWithDefaultMethod<T extends Number> extends Function<T, T> {
227f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
237f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  @Override
247f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  T apply(T input);
257f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
267f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  static <T extends Number> Function<T, Long> toLong() {
277f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    return input -> input.longValue();
287f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  }
297f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
307f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  default T twice(T input) {
317f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    return apply(apply(input));
327f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  }
337f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
347f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  /** Don't call this method from tests, it won't work since Desugar moves it! */
357f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  static FunctionWithDefaultMethod<Integer> inc(int add) {
367f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    return input -> input + add;
377f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  }
387f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
397f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  /**
407f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael   * Implementation of {@link FunctionWithDefaultMethod} that overrides the default method.
417f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael   * Also declares static methods the test uses to exercise the code in this file.
427f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael   */
437f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  public static class DoubleInts implements FunctionWithDefaultMethod<Integer> {
447f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    @Override
457f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public Integer apply(Integer input) {
467f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return 2 * input;
477f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
487f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
497f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    @Override
507f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public Integer twice(Integer input) {
517f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return 5 * input; // deliberately wrong :)
527f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
537f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
547f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public static List<Long> add(List<Integer> ints, int add) {
557f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return ints.stream().map(inc(add)).map(toLong()).collect(Collectors.toList());
567f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
577f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
587f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public static FunctionWithDefaultMethod<Integer> doubleLambda() {
597f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return input -> 2 * input;
607f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
617f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
627f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public static FunctionWithDefaultMethod<Integer> incTwice(int add) {
637f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return inc(add)::twice;
647f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
657f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
667f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public static FunctionWithDefaultMethod<Integer> times5() {
677f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return new DoubleInts2()::twice;
687f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
697f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
707f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    public static Function<Integer, FunctionWithDefaultMethod<Integer>> incFactory() {
717f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael      return FunctionWithDefaultMethod::inc;
727f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael    }
737f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  }
747f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael
757f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  /** Empty subclass that explicitly implements the interface the superclass already implements. */
767f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  public static class DoubleInts2 extends DoubleInts implements FunctionWithDefaultMethod<Integer> {
777f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael  }
787f6f08b9b78fd02cdea4157980a42b576ae3c504ajmichael}
79