1 /*-
2 * #%L
3 * io.earcam.unexceptional
4 * %%
5 * Copyright (C) 2016 - 2017 earcam
6 * %%
7 * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
8 *
9 * You <b>must</b> choose to accept, in full - any individual or combination of
10 * the following licenses:
11 * <ul>
12 * <li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li>
13 * <li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li>
14 * <li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li>
15 * <li><a href="https://opensource.org/licenses/MIT">MIT</a></li>
16 * </ul>
17 * #L%
18 */
19 package io.earcam.unexceptional;
20
21 import java.io.Serializable; //NOSONAR SonarQube false positive - putting @SuppressWarnings("squid:UselessImportCheck") on class has no effect, can't put at package level either
22 import java.util.Objects;
23
24 /**
25 * A checked parallel of {@link java.lang.Runnable}
26 * Essentially {@link java.lang.Runnable} that has the declared propensity to <code>throw</code>
27 *
28 * For the equivalent of {@link java.util.concurrent.Callable}, see {@link io.earcam.unexceptional.CheckedSupplier}
29 *
30 * @param <E> the type of Throwable declared
31 *
32 * @since 0.2.0
33 *
34 * @see java.lang.Runnable
35 */
36 @FunctionalInterface
37 public interface CheckedRunnable<E extends Throwable> {
38
39 /**
40 * See {@link Runnable#run()}
41 *
42 * @throws Exception a checked exception
43 */
44 public abstract void run() throws E;
45
46
47 /**
48 * @param after the checked runnable to run sequentially <i>after</i> {@code this}
49 * @return a composite checked runnable of this and then after
50 * @throws NullPointerException if {@code after} is {@code null}
51 */
52 @SuppressWarnings("squid:S1905") // SonarQube false positive
53 public default CheckedRunnable<E> andThen(/* @Nonnull */ CheckedRunnable<? extends E> after)
54 {
55 Objects.requireNonNull(after);
56 return (CheckedRunnable<E> & Serializable) () -> {
57 run();
58 after.run();
59 };
60 }
61 }