cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / util / src / com / intellij / util / FunctionUtil.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.util;
3
4 import org.jetbrains.annotations.Contract;
5 import org.jetbrains.annotations.NotNull;
6 import org.jetbrains.annotations.Nullable;
7
8 public final class FunctionUtil {
9   private FunctionUtil() { }
10
11   @NotNull
12   public static <T> Function<T, T> id() {
13     return Functions.identity();
14   }
15
16   @NotNull
17   public static <A, B> NullableFunction<A, B> nullConstant() {
18     //noinspection unchecked,deprecation
19     return (NullableFunction<A, B>)NullableFunction.NULL;
20   }
21
22   @NotNull
23   public static <T> Function<T, String> string() {
24     return Functions.TO_STRING();
25   }
26
27   @NotNull
28   public static <A, B> Function<A, B> constant(final B b) {
29     return a -> b;
30   }
31
32   @NotNull
33   public static <A, B, C> NotNullFunction<A, C> composition(@NotNull final NotNullFunction<? super B, ? extends C> f, @NotNull final NotNullFunction<? super A, ? extends B> g) {
34     return a -> f.fun(g.fun(a));
35   }
36
37   /**
38    * Returns a runnable which runs both supplied runnables. If any of them throws, the second one is still executed.
39    * If both throw, the second exception is added to the first one as suppressed.
40    *
41    * @param r1 first runnable to run
42    * @param r2 second runnable to run
43    * @return composed runnable. If one of arguments is null, returns other argument.
44    */
45   @Contract(value = "_, null -> param1; null, !null -> param2", pure = true)
46   public static Runnable composeRunnables(@Nullable Runnable r1, @Nullable Runnable r2) {
47     if (r2 == null) return r1;
48     if (r1 == null) return r2;
49     return () -> {
50       try {
51         r1.run();
52       }
53       catch (RuntimeException | Error ex) {
54         try {
55           r2.run();
56         }
57         catch (RuntimeException | Error ex2) {
58           ex.addSuppressed(ex2);
59         }
60         throw ex;
61       }
62       r2.run();
63     };
64   }
65 }