// Copyright (c) 2019, 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 com.android.tools.r8;


import java.util.function.Function;

public interface ThrowableConsumer<Formal> {
  void accept(Formal formal) throws Throwable;

  default <T extends Throwable> void acceptWithHandler(
      Formal formal, Function<Throwable, T> handler) throws T {
    try {
      accept(formal);
    } catch (Throwable e) {
      throw handler.apply(e);
    }
  }

  default void acceptWithRuntimeException(Formal formal) {
    acceptWithHandler(
        formal,
        exception -> {
          if (exception instanceof RuntimeException) {
            throw (RuntimeException) exception;
          } else {
            throw new RuntimeException(exception);
          }
        });
  }

  default ThrowableConsumer<Formal> andThen(ThrowableConsumer<Formal> consumer) {
    return formal -> {
      accept(formal);
      consumer.accept(formal);
    };
  }

  static <Formal> ThrowableConsumer<Formal> empty() {
    return ignore -> {};
  }
}
