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.util.function.Predicate}
26 *
27 * @param <T> argument type
28 * @param <E> the type of Throwable declared
29 *
30 * @since 0.2.0
31 *
32 * @see java.util.function.Predicate
33 */
34 @FunctionalInterface
35 public interface CheckedPredicate<T, E extends Throwable> {
36
37 /**
38 * See {@link java.util.function.Predicate#test(Object)}
39 *
40 * @param t argument
41 * @return {@code true} if predicate matches, else {@code false}
42 * @throws Throwable any throwable
43 * @see java.util.function.Predicate#test(Object)
44 */
45 public abstract boolean test(T t) throws E;
46
47
48 /**
49 * See {@link java.util.function.Predicate#and(java.util.function.Predicate)}
50 *
51 * @param other the predicate to be compounded with logical <b>and</b>
52 * @return the composite {@link CheckedPredicate}
53 * @throws NullPointerException if {@code other} is {@code null}
54 */
55 @SuppressWarnings("squid:S1905") // SonarQube false positive
56 public default CheckedPredicate<T, E> and(/* @Nonnull */ CheckedPredicate<? super T, ? extends E> other)
57 {
58 Objects.requireNonNull(other);
59 return (CheckedPredicate<T, E> & Serializable) t -> test(t) && other.test(t);
60 }
61
62
63 /**
64 * See {@link java.util.function.Predicate#negate()}
65 *
66 * @return the negated {@link CheckedPredicate}
67 */
68 @SuppressWarnings("squid:S1905") // SonarQube false positive
69 public default CheckedPredicate<T, E> negate()
70 {
71 return (CheckedPredicate<T, E> & Serializable) t -> !test(t);
72 }
73
74
75 /**
76 * See {@link java.util.function.Predicate#or(java.util.function.Predicate)}
77 *
78 * @param other the predicate to be compounded with logical <b>or</b>
79 * @return the composite {@link CheckedPredicate}
80 * @throws NullPointerException if {@code other} is {@code null}
81 */
82 @SuppressWarnings("squid:S1905") // SonarQube false positive
83 public default CheckedPredicate<T, E> or(/* @Nonnull */ CheckedPredicate<? super T, ? extends E> other)
84 {
85 Objects.requireNonNull(other);
86 return (CheckedPredicate<T, E> & Serializable) t -> test(t) || other.test(t);
87 }
88 }