cleanup
[idea/community.git] / platform / util-rt / src / com / intellij / openapi / util / Pair.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.openapi.util;
3
4 import com.intellij.util.Function;
5 import org.jetbrains.annotations.NotNull;
6 import org.jetbrains.annotations.Nullable;
7
8 /**
9  * Generic wrapper around two related values.
10  */
11 public class Pair<A, B> {
12   public final A first;
13   public final B second;
14
15   @NotNull
16   public static <A, B> Pair<A, B> create(A first, B second) {
17     //noinspection DontUsePairConstructor
18     return new Pair<A, B>(first, second);
19   }
20
21   @NotNull
22   public static <A, B> NonNull<A, B> createNonNull(@NotNull A first, @NotNull B second) {
23     return new NonNull<A, B>(first, second);
24   }
25
26   @NotNull
27   public static <A, B> Pair<A, B> pair(A first, B second) {
28     //noinspection DontUsePairConstructor
29     return new Pair<A, B>(first, second);
30   }
31
32   @NotNull
33   public static <A, B> Function<A, Pair<A, B>> createFunction(final B value) {
34     return new Function<A, Pair<A, B>>() {
35       @Override
36       public Pair<A, B> fun(A a) {
37         return create(a, value);
38       }
39     };
40   }
41
42   public static <T> T getFirst(@Nullable Pair<T, ?> pair) {
43     return pair != null ? pair.first : null;
44   }
45
46   public static <T> T getSecond(@Nullable Pair<?, T> pair) {
47     return pair != null ? pair.second : null;
48   }
49
50   @SuppressWarnings("rawtypes")
51   private static final Pair EMPTY = create(null, null);
52
53   @NotNull
54   public static <A, B> Pair<A, B> empty() {
55     //noinspection unchecked
56     return EMPTY;
57   }
58
59   /**
60    * @see #create(Object, Object)
61    */
62   public Pair(A first, B second) {
63     this.first = first;
64     this.second = second;
65   }
66
67   public final A getFirst() {
68     return first;
69   }
70
71   public final B getSecond() {
72     return second;
73   }
74
75   @Override
76   public final boolean equals(Object o) {
77     return o instanceof Pair && Comparing.equal(first, ((Pair<?, ?>)o).first) && Comparing.equal(second, ((Pair<?, ?>)o).second);
78   }
79
80   @Override
81   public int hashCode() {
82     int result = first != null ? first.hashCode() : 0;
83     result = 31 * result + (second != null ? second.hashCode() : 0);
84     return result;
85   }
86
87   @Override
88   public String toString() {
89     return "<" + first + "," + second + ">";
90   }
91
92   public static class NonNull<A, B> extends Pair<A, B> {
93     public NonNull(@NotNull A first, @NotNull B second) {
94       super(first, second);
95     }
96   }
97 }