Skip to content

Instantly share code, notes, and snippets.

@chris-martin
Created September 23, 2013 05:53
Show Gist options
  • Save chris-martin/6666874 to your computer and use it in GitHub Desktop.
Save chris-martin/6666874 to your computer and use it in GitHub Desktop.
final class EqualsEquivalence<A>
implements Equivalence<A>
{
@Override
public boolean equals(A a, A b)
{
return a.equals(b);
}
@Override
public int hashCode(A obj)
{
return obj.hashCode();
}
<B> Equivalence<B> map(final Function<? super B, ? extends A> f)
{
return new Equivalence<B>()
{
@Override
public boolean equals(B a, B b)
{
return EqualsEquivalence.this.equals(f.apply(a), f.apply(b));
}
@Override
public int hashCode(B obj)
{
return EqualsEquivalence.this.hashCode(f.apply(obj));
}
};
}
}
interface Equivalence<T>
{
boolean equals(T a, T b);
int hashCode(T obj);
}
final class EquivalenceWrapper<T>
{
final T value;
final Equivalence<T> equivalence;
EquivalenceWrapper(
T value,
Equivalence<T> equivalence
)
{
this.value = value;
this.equivalence = equivalence;
}
@Override
@SuppressWarnings("unchecked")
public boolean equals(Object obj)
{
try
{
return equivalence.equals(
value,
((EquivalenceWrapper<T>) obj).value
);
}
catch (ClassCastException e)
{
return false;
}
}
@Override
public int hashCode()
{
return equivalence.hashCode(value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment