Skip to content

Commit 91dc690

Browse files
committed
Equal.equals0: helper method to implements Object.equals. Fix functionaljava#122
1 parent 206afa6 commit 91dc690

File tree

20 files changed

+73
-24
lines changed

20 files changed

+73
-24
lines changed

core/src/main/java/fj/Equal.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package fj;
22

33
import static fj.Function.curry;
4+
import static fj.Unit.unit;
45

56
import fj.data.*;
67
import fj.data.hlist.HList;
@@ -549,5 +550,33 @@ public static Option<Boolean> shallowEqualsO(Object o1, Object o2) {
549550
return Option.some(false);
550551
}
551552
}
553+
554+
/**
555+
* Helper method to implement {@link Object#equals(Object)} correctly. DO NOT USE it for any other purpose.
556+
*
557+
* @param clazz the class in which the {@link Object#equals(Object)} is implemented
558+
* @param self a reference to 'this'
559+
* @param other the other object of the comparison
560+
* @param equal an equal instance for the type of self (that use {@link #anyEqual()} if generic type).
561+
* @return true if self and other are equal
562+
*/
563+
@SuppressWarnings("unchecked")
564+
public static <A> boolean equals0(final java.lang.Class<? super A> clazz, final A self, final Object other, final Equal<A> equal) {
565+
return self == other ? true : clazz.isInstance(other) ? equal.eq(self, (A) other) : false;
566+
}
567+
568+
/**
569+
* Helper method to implement {@link Object#equals(Object)} correctly. DO NOT USE it for any other purpose.
570+
*
571+
* @param clazz the class in which the {@link Object#equals(Object)} is implemented
572+
* @param self a reference to 'this'
573+
* @param other the other object of the comparison
574+
* @param equal a lazy equal instance for the type (that use {@link #anyEqual()} if generic type)..
575+
* @return true if self and other are equal
576+
*/
577+
@SuppressWarnings("unchecked")
578+
public static <A> boolean equals0(final java.lang.Class<? super A> clazz, final A self, final Object other, final F<Unit, Equal<A>> equal) {
579+
return self == other ? true : clazz.isInstance(other) ? equal.f(unit()).eq(self, (A) other) : false;
580+
}
552581

553582
}

core/src/main/java/fj/P1.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,10 +254,9 @@ public String toString() {
254254
return Show.p1Show(Show.<A>anyShow()).showS(this);
255255
}
256256

257-
@SuppressWarnings("unchecked")
258257
@Override
259258
public boolean equals(Object other) {
260-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p1Equal(Equal.<A>anyEqual()).eq(this, (P1<A>) other)));
259+
return Equal.equals0(P1.class, this, other, u -> Equal.p1Equal(Equal.<A>anyEqual()));
261260
}
262261

263262
@Override

core/src/main/java/fj/P2.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public abstract class P2<A, B> {
2626

2727
@Override
2828
public boolean equals(Object other) {
29-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p2Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual()).eq(this, (P2<A, B>) other)));
29+
return Equal.equals0(P2.class, this, other, u -> Equal.p2Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual()));
3030
}
3131

3232
@Override

core/src/main/java/fj/P3.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ public String toString() {
192192

193193
@Override
194194
public boolean equals(Object other) {
195-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p3Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual()).eq(this, (P3<A, B, C>) other)));
195+
return Equal.equals0(P3.class, this, other,
196+
u -> Equal.p3Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual()));
196197
}
197198

198199
@Override

core/src/main/java/fj/P4.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,8 @@ public String toString() {
265265

266266
@Override
267267
public boolean equals(Object other) {
268-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p4Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual()).eq(this, (P4<A, B, C, D>) other)));
268+
return Equal.equals0(P4.class, this, other,
269+
u -> Equal.p4Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual()));
269270
}
270271

271272
@Override

core/src/main/java/fj/P5.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,8 @@ public String toString() {
344344

345345
@Override
346346
public boolean equals(Object other) {
347-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p5Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual()).eq(this, (P5<A, B, C, D, E>) other)));
347+
return Equal.equals0(P5.class, this, other,
348+
u -> Equal.p5Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual()));
348349
}
349350

350351
@Override

core/src/main/java/fj/P6.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ public String toString() {
435435

436436
@Override
437437
public boolean equals(Object other) {
438-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p6Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual(), Equal.<F>anyEqual()).eq(this, (P6<A, B, C, D, E, F>) other)));
438+
return Equal.equals0(P6.class, this, other,
439+
u -> Equal.p6Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual(), Equal.<F>anyEqual()));
439440
}
440441

441442
@Override

core/src/main/java/fj/P7.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,8 @@ public String toString() {
529529

530530
@Override
531531
public boolean equals(Object other) {
532-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p7Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual(), Equal.<F>anyEqual(), Equal.<G>anyEqual()).eq(this, (P7<A, B, C, D, E, F, G>) other)));
532+
return Equal.equals0(P7.class, this, other,
533+
u -> Equal.p7Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual(), Equal.<F>anyEqual(), Equal.<G>anyEqual()));
533534
}
534535

535536
@Override

core/src/main/java/fj/P8.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,8 @@ public String toString() {
635635

636636
@Override
637637
public boolean equals(Object other) {
638-
return Equal.shallowEqualsO(this, other).orSome(P.lazy(u -> Equal.p8Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual(), Equal.<F>anyEqual(), Equal.<G>anyEqual(), Equal.<H>anyEqual()).eq(this, (P8<A, B, C, D, E, F, G, H>) other)));
638+
return Equal.equals0(P8.class, this, other,
639+
u -> Equal.p8Equal(Equal.<A>anyEqual(), Equal.<B>anyEqual(), Equal.<C>anyEqual(), Equal.<D>anyEqual(), Equal.<E>anyEqual(), Equal.<F>anyEqual(), Equal.<G>anyEqual(), Equal.<H>anyEqual()));
639640
}
640641

641642
@Override

core/src/main/java/fj/data/Array.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ public boolean exists(final F<A, Boolean> f) {
682682

683683
@Override
684684
public boolean equals(Object o) {
685-
return Equal.shallowEqualsO(this, o).orSome(P.lazy(u -> Equal.arrayEqual(Equal.<A>anyEqual()).eq(this, (Array<A>) o)));
685+
return Equal.equals0(Array.class, this, o, u -> Equal.arrayEqual(Equal.<A>anyEqual()));
686686
}
687687

688688
/**

0 commit comments

Comments
 (0)