cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / util-rt / src / com / intellij / util / Functions.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 com.intellij.openapi.util.Pair;
5 import org.jetbrains.annotations.NotNull;
6
7 import java.util.Arrays;
8 import java.util.Collections;
9 import java.util.Map;
10
11 /**
12  * @author gregsh
13  */
14 public final class Functions {
15   @NotNull
16   public static <A> Function.Mono<A> id() {
17     return (Function.Mono<A>)identity();
18   }
19
20   @NotNull
21   public static <A, B> Function<A, B> constant(final B b) {
22     return new Function<A, B>() {
23       public B fun(A a) {
24         return b;
25       }
26     };
27   }
28
29   @NotNull
30   public static <A, B> Function<A, B> identity() {
31     //noinspection deprecation,unchecked
32     return (Function<A, B>)Function.ID;
33   }
34
35   @NotNull
36   public static <A, B> Function<A, B> cast(@NotNull Class<B> clazz) {
37     return identity();
38   }
39
40   @NotNull
41   public static <A, B, C> Function<A, C> compose(@NotNull final Function<? super A, ? extends B> f1, @NotNull final Function<? super B, ? extends C> f2) {
42     if (f1 == identity() || f2 == identity()) {
43       if (f1 == f2) {
44         return identity();
45       }
46       if (f1 == identity()) {
47         //noinspection unchecked
48         return (Function<A, C>)f2;
49       }
50       //noinspection unchecked
51       return (Function<A, C>)f1;
52     }
53     return new Function<A, C>() {
54       public C fun(A a) {
55         return f2.fun(f1.fun(a));
56       }
57     };
58   }
59
60   @NotNull
61   public static <A> Function<A, String> TO_STRING() {
62     //noinspection unchecked,deprecation
63     return (Function<A, String>)Function.TO_STRING;
64   }
65
66   @NotNull
67   public static <A, B> Function<A, B> fromMap(@NotNull final Map<? super A, ? extends B> map) {
68     return new Function<A, B>() {
69       public B fun(A a) {
70         return map.get(a);
71       }
72     };
73   }
74
75   private static final Function<Pair<?, ?>, Object> PAIR_FIRST = new Function<Pair<?, ?>, Object>() {
76     public Object fun(Pair<?, ?> pair) {
77       return Pair.getFirst(pair);
78     }
79   };
80
81   private static final Function<Pair<?, ?>, Object> PAIR_SECOND = new Function<Pair<?, ?>, Object>() {
82     public Object fun(Pair<?, ?> pair) {
83       return Pair.getSecond(pair);
84     }
85   };
86
87   @NotNull
88   public static <A> Function<Pair<A, ?>, A> pairFirst() {
89     //noinspection unchecked
90     return (Function<Pair<A,?>, A>)(Function<?,?>)PAIR_FIRST;
91   }
92
93   @NotNull
94   public static <B> Function<Pair<?, B>, B> pairSecond() {
95     //noinspection unchecked
96     return (Function<Pair<?, B>, B>)(Function<?,?>)PAIR_SECOND;
97   }
98
99   private static final Function<Object[], Iterable<Object>> WRAP_ARRAY = new Function<Object[], Iterable<Object>>() {
100     public Iterable<Object> fun(Object[] t) {
101       return t == null ? Collections.emptyList() : Arrays.asList(t);
102     }
103   };
104
105   @NotNull
106   public static <T> Function<T[], Iterable<T>> wrapArray() {
107     //noinspection unchecked
108     return (Function<T[], Iterable<T>>)(Function<?,?>)WRAP_ARRAY;
109   }
110 }