/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.template.soy.internal.base;
import java.util.Objects;
import javax.annotation.Nullable;
/**
* An immutable, semantic-free ordered pair of nullable values. These can be accessed using the
* {@link #first} and {@link #second} fields. Equality and hashing are defined in the natural way.
*
* <p>This type is devoid of semantics, best used for simple mechanical aggregations of unrelated
* values in implementation code. Avoid using it in your APIs, preferring an explicit type that
* conveys the exact semantics of the data. For example, instead of: <xmp>
*
* <p>Pair<T, T> findMinAndMax(List<T> list) {...}</xmp>
*
* <p>... use: <xmp>
*
* <p>Range<T> findRange(List<T> list) {...}</xmp>
*
* <p>This usually involves creating a new custom value-object type. This is difficult to do "by
* hand" in Java, but avoid the temptation to extend {@code Pair} to accomplish this; consider using
* the utilities {@link com.google.common.auto.AutoValue} to help you with this instead.
*
*/
public final class Pair<A, B> {
/** Creates a new pair containing the given elements in order. */
public static <A, B> Pair<A, B> of(@Nullable A first, @Nullable B second) {
return new Pair<>(first, second);
}
/** The first element of the pair. */
public final A first;
/** The second element of the pair. */
public final B second;
private Pair(@Nullable A first, @Nullable B second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(@Nullable Object object) {
if (object instanceof Pair<?, ?>) {
Pair<?, ?> that = (Pair<?, ?>) object;
return Objects.equals(this.first, that.first) && Objects.equals(this.second, that.second);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(first, second);
}
/**
* {@inheritDoc}
*
* <p>This implementation returns a string in the form {@code (first, second)}, where {@code
* first} and {@code second} are the String representations of the first and second elements of
* this pair, as given by {@link String#valueOf(Object)}. Subclasses are free to override this
* behavior.
*/
@Override
public String toString() {
return "(" + first + ", " + second + ")";
}
}