// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package lambdas_jstyle_trivial;

public class Lambdas {
  public interface IntConsumer {
    void put(int value);
  }

  public interface Consumer<T> {
    void put(T t);
  }

  public interface Supplier<T> {
    T get();
  }

  public interface IntSupplier {
    int get();
  }

  public interface MultiFunction<R, P1, P2, P3> {
    R get(P1 a, P2 b, P3 c);
  }

  public synchronized static void acceptStringSupplier(Supplier<String> s) {
    System.out.println(s.get());
  }

  public synchronized static <T> void acceptGenericSupplier(Supplier<T> s) {
    System.out.println(s.get());
  }

  public synchronized static void acceptIntSupplier(IntSupplier s) {
    System.out.println(s.get());
  }

  public synchronized static void acceptStringConsumer(Consumer<String> s, String arg) {
    s.put(arg);
  }

  public synchronized static <T> void acceptGenericConsumer(Consumer<T> s, T arg) {
    s.put(arg);
  }

  public synchronized static void acceptIntConsumer(IntConsumer s, int arg) {
    s.put(arg);
  }

  public synchronized static <R, P1, P2, P3>
  void acceptMultiFunction(MultiFunction<R, P1, P2, P3> s, P1 a, P2 b, P3 c) {
    System.out.println(s.get(a, b, c));
  }
}
