11package org .highj .typeclass2 .arrow ;
22
3+ import com .pholser .junit .quickcheck .Property ;
34import org .derive4j .hkt .__2 ;
45import org .highj .Hkt ;
5- import org .highj .data .eq .Eq ;
66import org .highj .data .tuple .T2 ;
77import org .highj .function .F1 ;
8- import org .highj .util .Gen ;
9- import org .highj .util .Law ;
108
119import java .util .function .Function ;
1210
1311import static org .assertj .core .api .Assertions .assertThat ;
1412
15- public abstract class ArrowLaw <A > implements Law {
13+ public interface ArrowContract <A > {
1614
17- private final Arrow <A > arrow ;
15+ Arrow <A > subject () ;
1816
19- public ArrowLaw (Arrow <A > arrow ) {
20- this .arrow = arrow ;
21- }
22-
23- public abstract <B , C > boolean areEqual (__2 <A , B , C > one , __2 <A , B , C > two , B b , Eq <C > eq );
24-
25- @ Override
26- public void test () {
27- arrowIdentity ();
28- composition ();
29- arrFirst ();
30- firstComposition ();
31- t2_1 ();
32- split ();
33- assoc ();
34- }
17+ <B , C > boolean areEqual (__2 <A , B , C > one , __2 <A , B , C > two , B b );
3518
3619 // arr id = id
37- public void arrowIdentity () {
20+ @ Property
21+ default void arrowIdentity (String s ) {
22+ Arrow <A > arrow = subject ();
3823 __2 <A , String , String > arrowOfId = arrow .arr (Function .identity ());
3924 __2 <A , String , String > arrowIdentity = arrow .identity ();
40- for (String s : Gen .stringGen .get (20 )) {
41- assertThat (areEqual (arrowOfId , arrowIdentity , s , Eq .fromEquals ())).isTrue ();
42- }
25+ assertThat (areEqual (arrowOfId , arrowIdentity , s )).isTrue ();
4326 }
4427
28+
4529 // arr (f >>> g) = arr f >>> arr g
46- public void composition () {
30+ @ Property
31+ default void composition (String s ) {
32+ Arrow <A > arrow = subject ();
4733 Function <String , Integer > f1 = String ::length ;
4834 Function <Integer , Integer > f2 = x -> x * x ;
4935 __2 <A , String , Integer > arrOfComposed = arrow .arr (f1 .andThen (f2 ));
5036 __2 <A , String , Integer > composedArr = arrow .then (arrow .arr (f1 ), arrow .arr (f2 ));
51- for (String s : Gen .stringGen .get (20 )) {
52- assertThat (areEqual (arrOfComposed , composedArr , s , Eq .fromEquals ())).isTrue ();
53- }
37+ assertThat (areEqual (arrOfComposed , composedArr , s )).isTrue ();
5438 }
5539
5640 // first (arr f) = arr (first f)
57- public void arrFirst () {
41+ @ Property
42+ default void arrFirst (T2 <String , Boolean > t2 ) {
43+ Arrow <A > arrow = subject ();
5844 F1 <String , Integer > fn = String ::length ;
5945 __2 <A , T2 <String , Boolean >, T2 <Integer , Boolean >> firstArr = arrow .first (arrow .arr (fn ));
6046 __2 <A , T2 <String , Boolean >, T2 <Integer , Boolean >> arrFirst = arrow .arr (F1 .arrow .first (fn ));
61- for (T2 <String , Boolean > t2 : Gen .zip (Gen .stringGen , Gen .boolGen ).get (20 )) {
62- assertThat (areEqual (firstArr , arrFirst , t2 ,
63- T2 .eq (Eq .fromEquals (), Eq .fromEquals ()))).isTrue ();
64- }
47+ assertThat (areEqual (firstArr , arrFirst , t2 )).isTrue ();
6548 }
6649
6750 // first (f >>> g) = first f >>> first g
68- public void firstComposition () {
51+ @ Property
52+ default void firstComposition (T2 <String , Boolean > t2 ) {
53+ Arrow <A > arrow = subject ();
6954 __2 <A , String , Integer > f = arrow .arr (String ::length );
7055 __2 <A , Integer , Integer > g = arrow .arr (x -> x * x );
7156 __2 <A , T2 <String , Boolean >, T2 <Integer , Boolean >> firstOfComposed =
7257 arrow .first (arrow .then (f , g ));
7358 __2 <A , T2 <String , Boolean >, T2 <Integer , Boolean >> composedFirst =
7459 arrow .then (arrow .first (f ), arrow .first (g ));
75- for (T2 <String , Boolean > t2 : Gen .zip (Gen .stringGen , Gen .boolGen ).get (20 )) {
76- assertThat (areEqual (firstOfComposed , composedFirst , t2 ,
77- T2 .eq (Eq .fromEquals (), Eq .fromEquals ()))).isTrue ();
78- }
60+ assertThat (areEqual (firstOfComposed , composedFirst , t2 )).isTrue ();
7961 }
8062
8163 // first f >>> arr fst = arr fst >>> f
82- public void t2_1 () {
64+ @ Property
65+ default void t2_1 (T2 <String , Boolean > t2 ) {
66+ Arrow <A > arrow = subject ();
8367 __2 <A , String , Integer > f = arrow .arr (String ::length );
8468
8569 __2 <A , T2 <String , Boolean >, Integer > firstThenT2 = arrow .then (arrow .first (f ), arrow .arr (T2 ::_1 ));
8670 __2 <A , T2 <String , Boolean >, Integer > T2ThenF = arrow .then (arrow .arr (T2 ::_1 ), f );
8771
88- for (T2 <String , Boolean > t2 : Gen .zip (Gen .stringGen , Gen .boolGen ).get (20 )) {
89- assertThat (areEqual (firstThenT2 , T2ThenF , t2 , Eq .fromEquals ())).isTrue ();
90- }
72+ assertThat (areEqual (firstThenT2 , T2ThenF , t2 )).isTrue ();
9173 }
9274
9375 // first f >>> arr (id *** g) = arr (id *** g) >>> first f
94- public void split () {
76+ @ Property
77+ default void split (T2 <String , Long > t2 ) {
78+ Arrow <A > arrow = subject ();
9579 __2 <A , String , Integer > f = arrow .arr (String ::length );
9680 __2 <F1 .µ , Long , Long > g = (F1 <Long , Long >) x -> x * x ;
9781
@@ -101,14 +85,13 @@ public void split() {
10185 __2 <A , T2 <String , Long >, T2 <String , Long >> g2 = arrow .arr (Hkt .asF1 (F1 .arrow .split (F1 .arrow .identity (), g )));
10286 __2 <A , T2 <String , Long >, T2 <Integer , Long >> splittedFirst = arrow .then (g2 , arrow .first (f ));
10387
104- for (T2 <String , Long > t2 : Gen .zip (Gen .stringGen , Gen .longGen ).get (20 )) {
105- assertThat (areEqual (firstSplitted , splittedFirst , t2 ,
106- T2 .eq (Eq .fromEquals (), Eq .fromEquals ()))).isTrue ();
107- }
88+ assertThat (areEqual (firstSplitted , splittedFirst , t2 )).isTrue ();
10889 }
10990
11091 // first (first f) >>> arr assoc = arr assoc >>> first f -- where assoc ((a,b),c) = (a,(b,c))
111- public void assoc () {
92+ @ Property
93+ default void assoc (T2 <T2 <String , Boolean >, Long > nestedT2 ) {
94+ Arrow <A > arrow = subject ();
11295 __2 <A , String , Integer > f = arrow .arr (String ::length );
11396
11497 __2 <A , T2 <T2 <String , Boolean >, Long >, T2 <T2 <Integer , Boolean >, Long >> firstFirst =
@@ -125,10 +108,7 @@ public void assoc() {
125108 __2 <A , T2 <T2 <String , Boolean >, Long >, T2 <Integer , T2 <Boolean , Long >>> assocFirst =
126109 arrow .then (arrAssoc2 , first );
127110
128- for (T2 <T2 <String , Boolean >, Long > t2 : Gen .zip (Gen .zip (Gen .stringGen , Gen .boolGen ), Gen .longGen ).get (20 )) {
129- assertThat (areEqual (firstAssoc , assocFirst , t2 ,
130- T2 .eq (Eq .fromEquals (), T2 .eq (Eq .fromEquals (), Eq .fromEquals ())))).isTrue ();
131- }
111+ assertThat (areEqual (firstAssoc , assocFirst , nestedT2 )).isTrue ();
132112 }
133113
134- }
114+ }
0 commit comments