387211542b4aca9cd79dd2bd865442ea075132b3
[idea/community.git] / platform / util-rt / src / com / intellij / openapi / util / Pair.java
1 // Copyright 2000-2019 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       public Pair<A, B> fun(A a) {
36         return create(a, value);
37       }
38     };
39   }
40
41   public static <T> T getFirst(@Nullable Pair<T, ?> pair) {
42     return pair != null ? pair.first : null;
43   }
44
45   public static <T> T getSecond(@Nullable Pair<?, T> pair) {
46     return pair != null ? pair.second : null;
47   }
48
49   @SuppressWarnings("rawtypes")
50   private static final Pair EMPTY = create(null, null);
51
52   @NotNull
53   public static <A, B> Pair<A, B> empty() {
54     //noinspection unchecked
55     return EMPTY;
56   }
57
58   /**
59    * @see #create(Object, Object)
60    */
61   public Pair(A first, B second) {
62     this.first = first;
63     this.second = second;
64   }
65
66   public final A getFirst() {
67     return first;
68   }
69
70   public final B getSecond() {
71     return second;
72   }
73
74   @Override
75   public final boolean equals(Object o) {
76     return o instanceof Pair && Comparing.equal(first, ((Pair<?, ?>)o).first) && Comparing.equal(second, ((Pair<?, ?>)o).second);
77   }
78
79   @Override
80   public int hashCode() {
81     int result = first != null ? first.hashCode() : 0;
82     result = 31 * result + (second != null ? second.hashCode() : 0);
83     return result;
84   }
85
86   @Override
87   public String toString() {
88     return "<" + first + "," + second + ">";
89   }
90
91   public static class NonNull<A, B> extends Pair<A, B> {
92     public NonNull(@NotNull A first, @NotNull B second) {
93       super(first, second);
94     }
95   }
96 }