@@ -132,6 +132,74 @@ public boolean equal(B b1, B b2) {
132132 });
133133 }
134134
135+ /**
136+ * Constructs an equal instance, which tests equality of self and the mapped object in "and" manner
137+ *
138+ * @param f The function to map the original object
139+ * @param eq Equality for the mapped object
140+ * @return A new equal instance
141+ */
142+ public final <B > Equal <A > andThen (final F <A , B > f , final Equal <B > eq ) {
143+ return and (eq .contramap (f ));
144+ }
145+
146+ /**
147+ * An equal instance, which executes two Equality of self in "and" manner
148+ *
149+ * @param eq Another equality for self
150+ * @return A new equal instance
151+ */
152+ public final Equal <A > and (final Equal <A > eq ) {
153+ return equalDef ((a1 , a2 ) -> def .equal (a1 , a2 ) && eq .def .equal (a1 , a2 ));
154+ }
155+
156+ /**
157+ * An equal instance, which executes two Equality of self in "or" manner
158+ *
159+ * @param eq Another equality for self
160+ * @return A new equal instance
161+ */
162+ public final Equal <A > or (final Equal <A > eq ) {
163+ return equalDef ((a1 , a2 ) -> def .equal (a1 , a2 ) || eq .def .equal (a1 , a2 ));
164+ }
165+
166+ /**
167+ * An equal instance, which reverts equality for self
168+ *
169+ * @return A new equal instance
170+ */
171+ public final Equal <A > not () {
172+ return equalDef ((a1 , a2 ) -> !def .equal (a1 , a2 ));
173+ }
174+
175+ /**
176+ * Static version of {@link #contramap(F)}
177+ */
178+ public static <A , B > Equal <A > contramap (final F <A , B > f , final Equal <B > eq ) {
179+ return eq .contramap (f );
180+ }
181+
182+ /**
183+ * Static version of {@link #and(Equal)}
184+ */
185+ public static <A > Equal <A > and (final Equal <A > eq1 , final Equal <A > eq2 ) {
186+ return eq1 .and (eq2 );
187+ }
188+
189+ /**
190+ * Static version of {@link #or(Equal)}
191+ */
192+ public static <A > Equal <A > or (final Equal <A > eq1 , final Equal <A > eq2 ) {
193+ return eq1 .or (eq2 );
194+ }
195+
196+ /**
197+ * Static version of {@link #not()}
198+ */
199+ public static <A > Equal <A > not (final Equal <A > eq ) {
200+ return eq .not ();
201+ }
202+
135203 /**
136204 * Constructs an equal instance from the given function.
137205 *
0 commit comments