| // 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 -> {}; | 
 |   } | 
 | } |