Skip to content

Commit c1c4893

Browse files
committed
Product invert/rotateL/R cardinality variants with tuple specializations
1 parent e86e212 commit c1c4893

22 files changed

+1069
-12
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
1111

1212
### Added
1313
- `Predicate#predicate` static factory method
14+
- `Product2-8` left/right rotation methods
15+
- `Tuple2-8` specializations of left/right product rotation
1416

1517
## [3.1.0] - 2018-07-16
1618
### Added

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple2.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public _2 setValue(_2 value) {
7070
throw new UnsupportedOperationException();
7171
}
7272

73+
@Override
74+
public Tuple2<_2, _1> invert() {
75+
return tuple(_2, _1);
76+
}
77+
7378
@Override
7479
public <_2Prime> Tuple2<_1, _2Prime> fmap(Function<? super _2, ? extends _2Prime> fn) {
7580
return Monad.super.<_2Prime>fmap(fn).coerce();

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple3.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,21 @@ public _3 _3() {
6161
return _3;
6262
}
6363

64+
@Override
65+
public Tuple3<_2, _3, _1> rotateL3() {
66+
return tuple(_2, _3, _1);
67+
}
68+
69+
@Override
70+
public Tuple3<_3, _1, _2> rotateR3() {
71+
return tuple(_3, _1, _2);
72+
}
73+
74+
@Override
75+
public Tuple3<_2, _1, _3> invert() {
76+
return tuple(_2, _1, _3);
77+
}
78+
6479
@Override
6580
@SuppressWarnings("unchecked")
6681
public <_3Prime> Tuple3<_1, _2, _3Prime> fmap(Function<? super _3, ? extends _3Prime> fn) {

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple4.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,43 @@ public _4 _4() {
7070
}
7171

7272
@Override
73-
@SuppressWarnings("unchecked")
73+
public Tuple4<_2, _3, _4, _1> rotateL4() {
74+
return tuple(_2, _3, _4, _1);
75+
}
76+
77+
@Override
78+
public Tuple4<_4, _1, _2, _3> rotateR4() {
79+
return tuple(_4, _1, _2, _3);
80+
}
81+
82+
@Override
83+
public Tuple4<_2, _3, _1, _4> rotateL3() {
84+
return tuple(_2, _3, _1, _4);
85+
}
86+
87+
@Override
88+
public Tuple4<_3, _1, _2, _4> rotateR3() {
89+
return tuple(_3, _1, _2, _4);
90+
}
91+
92+
@Override
93+
public Tuple4<_2, _1, _3, _4> invert() {
94+
return tuple(_2, _1, _3, _4);
95+
}
96+
97+
@Override
7498
public <_4Prime> Tuple4<_1, _2, _3, _4Prime> fmap(Function<? super _4, ? extends _4Prime> fn) {
75-
return (Tuple4<_1, _2, _3, _4Prime>) Monad.super.fmap(fn);
99+
return (Tuple4<_1, _2, _3, _4Prime>) Monad.super.<_4Prime>fmap(fn);
76100
}
77101

78102
@Override
79-
@SuppressWarnings("unchecked")
80103
public <_3Prime> Tuple4<_1, _2, _3Prime, _4> biMapL(Function<? super _3, ? extends _3Prime> fn) {
81-
return (Tuple4<_1, _2, _3Prime, _4>) Bifunctor.super.biMapL(fn);
104+
return (Tuple4<_1, _2, _3Prime, _4>) Bifunctor.super.<_3Prime>biMapL(fn);
82105
}
83106

84107
@Override
85-
@SuppressWarnings("unchecked")
86108
public <_4Prime> Tuple4<_1, _2, _3, _4Prime> biMapR(Function<? super _4, ? extends _4Prime> fn) {
87-
return (Tuple4<_1, _2, _3, _4Prime>) Bifunctor.super.biMapR(fn);
109+
return (Tuple4<_1, _2, _3, _4Prime>) Bifunctor.super.<_4Prime>biMapR(fn);
88110
}
89111

90112
@Override

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple5.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,41 @@ public _5 _5() {
7777
return _5;
7878
}
7979

80+
@Override
81+
public Tuple5<_2, _3, _4, _5, _1> rotateL5() {
82+
return tuple(_2, _3, _4, _5, _1);
83+
}
84+
85+
@Override
86+
public Tuple5<_5, _1, _2, _3, _4> rotateR5() {
87+
return tuple(_5, _1, _2, _3, _4);
88+
}
89+
90+
@Override
91+
public Tuple5<_2, _3, _4, _1, _5> rotateL4() {
92+
return tuple(_2, _3, _4, _1, _5);
93+
}
94+
95+
@Override
96+
public Tuple5<_4, _1, _2, _3, _5> rotateR4() {
97+
return tuple(_4, _1, _2, _3, _5);
98+
}
99+
100+
@Override
101+
public Tuple5<_2, _3, _1, _4, _5> rotateL3() {
102+
return tuple(_2, _3, _1, _4, _5);
103+
}
104+
105+
@Override
106+
public Tuple5<_3, _1, _2, _4, _5> rotateR3() {
107+
return tuple(_3, _1, _2, _4, _5);
108+
}
109+
110+
@Override
111+
public Tuple5<_2, _1, _3, _4, _5> invert() {
112+
return tuple(_2, _1, _3, _4, _5);
113+
}
114+
80115
@Override
81116
public <_5Prime> Tuple5<_1, _2, _3, _4, _5Prime> fmap(Function<? super _5, ? extends _5Prime> fn) {
82117
return Monad.super.<_5Prime>fmap(fn).coerce();

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple6.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,51 @@ public _6 _6() {
8686
return _6;
8787
}
8888

89+
@Override
90+
public Tuple6<_2, _3, _4, _5, _6, _1> rotateL6() {
91+
return tuple(_2, _3, _4, _5, _6, _1);
92+
}
93+
94+
@Override
95+
public Tuple6<_6, _1, _2, _3, _4, _5> rotateR6() {
96+
return tuple(_6, _1, _2, _3, _4, _5);
97+
}
98+
99+
@Override
100+
public Tuple6<_2, _3, _4, _5, _1, _6> rotateL5() {
101+
return tuple(_2, _3, _4, _5, _1, _6);
102+
}
103+
104+
@Override
105+
public Tuple6<_5, _1, _2, _3, _4, _6> rotateR5() {
106+
return tuple(_5, _1, _2, _3, _4, _6);
107+
}
108+
109+
@Override
110+
public Tuple6<_2, _3, _4, _1, _5, _6> rotateL4() {
111+
return tuple(_2, _3, _4, _1, _5, _6);
112+
}
113+
114+
@Override
115+
public Tuple6<_4, _1, _2, _3, _5, _6> rotateR4() {
116+
return tuple(_4, _1, _2, _3, _5, _6);
117+
}
118+
119+
@Override
120+
public Tuple6<_2, _3, _1, _4, _5, _6> rotateL3() {
121+
return tuple(_2, _3, _1, _4, _5, _6);
122+
}
123+
124+
@Override
125+
public Tuple6<_3, _1, _2, _4, _5, _6> rotateR3() {
126+
return tuple(_3, _1, _2, _4, _5, _6);
127+
}
128+
129+
@Override
130+
public Tuple6<_2, _1, _3, _4, _5, _6> invert() {
131+
return tuple(_2, _1, _3, _4, _5, _6);
132+
}
133+
89134
@Override
90135
public <_6Prime> Tuple6<_1, _2, _3, _4, _5, _6Prime> fmap(Function<? super _6, ? extends _6Prime> fn) {
91136
return Monad.super.<_6Prime>fmap(fn).coerce();

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple7.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,61 @@ public _7 _7() {
9595
return _7;
9696
}
9797

98+
@Override
99+
public Tuple7<_2, _3, _4, _5, _6, _7, _1> rotateL7() {
100+
return tuple(_2, _3, _4, _5, _6, _7, _1);
101+
}
102+
103+
@Override
104+
public Tuple7<_7, _1, _2, _3, _4, _5, _6> rotateR7() {
105+
return tuple(_7, _1, _2, _3, _4, _5, _6);
106+
}
107+
108+
@Override
109+
public Tuple7<_2, _3, _4, _5, _6, _1, _7> rotateL6() {
110+
return tuple(_2, _3, _4, _5, _6, _1, _7);
111+
}
112+
113+
@Override
114+
public Tuple7<_6, _1, _2, _3, _4, _5, _7> rotateR6() {
115+
return tuple(_6, _1, _2, _3, _4, _5, _7);
116+
}
117+
118+
@Override
119+
public Tuple7<_2, _3, _4, _5, _1, _6, _7> rotateL5() {
120+
return tuple(_2, _3, _4, _5, _1, _6, _7);
121+
}
122+
123+
@Override
124+
public Tuple7<_5, _1, _2, _3, _4, _6, _7> rotateR5() {
125+
return tuple(_5, _1, _2, _3, _4, _6, _7);
126+
}
127+
128+
@Override
129+
public Tuple7<_2, _3, _4, _1, _5, _6, _7> rotateL4() {
130+
return tuple(_2, _3, _4, _1, _5, _6, _7);
131+
}
132+
133+
@Override
134+
public Tuple7<_4, _1, _2, _3, _5, _6, _7> rotateR4() {
135+
return tuple(_4, _1, _2, _3, _5, _6, _7);
136+
}
137+
138+
@Override
139+
public Tuple7<_2, _3, _1, _4, _5, _6, _7> rotateL3() {
140+
return tuple(_2, _3, _1, _4, _5, _6, _7);
141+
}
142+
143+
@Override
144+
public Tuple7<_3, _1, _2, _4, _5, _6, _7> rotateR3() {
145+
return tuple(_3, _1, _2, _4, _5, _6, _7);
146+
}
147+
148+
@Override
149+
public Tuple7<_2, _1, _3, _4, _5, _6, _7> invert() {
150+
return tuple(_2, _1, _3, _4, _5, _6, _7);
151+
}
152+
98153
@Override
99154
public <_7Prime> Tuple7<_1, _2, _3, _4, _5, _6, _7Prime> fmap(Function<? super _7, ? extends _7Prime> fn) {
100155
return Monad.super.<_7Prime>fmap(fn).coerce();

src/main/java/com/jnape/palatable/lambda/adt/hlist/Tuple8.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,71 @@ public _8 _8() {
104104
return _8;
105105
}
106106

107+
@Override
108+
public Tuple8<_2, _3, _4, _5, _6, _7, _8, _1> rotateL8() {
109+
return tuple(_2, _3, _4, _5, _6, _7, _8, _1);
110+
}
111+
112+
@Override
113+
public Tuple8<_8, _1, _2, _3, _4, _5, _6, _7> rotateR8() {
114+
return tuple(_8, _1, _2, _3, _4, _5, _6, _7);
115+
}
116+
117+
@Override
118+
public Tuple8<_2, _3, _4, _5, _6, _7, _1, _8> rotateL7() {
119+
return tuple(_2, _3, _4, _5, _6, _7, _1, _8);
120+
}
121+
122+
@Override
123+
public Tuple8<_7, _1, _2, _3, _4, _5, _6, _8> rotateR7() {
124+
return tuple(_7, _1, _2, _3, _4, _5, _6, _8);
125+
}
126+
127+
@Override
128+
public Tuple8<_2, _3, _4, _5, _6, _1, _7, _8> rotateL6() {
129+
return tuple(_2, _3, _4, _5, _6, _1, _7, _8);
130+
}
131+
132+
@Override
133+
public Tuple8<_6, _1, _2, _3, _4, _5, _7, _8> rotateR6() {
134+
return tuple(_6, _1, _2, _3, _4, _5, _7, _8);
135+
}
136+
137+
@Override
138+
public Tuple8<_2, _3, _4, _5, _1, _6, _7, _8> rotateL5() {
139+
return tuple(_2, _3, _4, _5, _1, _6, _7, _8);
140+
}
141+
142+
@Override
143+
public Tuple8<_5, _1, _2, _3, _4, _6, _7, _8> rotateR5() {
144+
return tuple(_5, _1, _2, _3, _4, _6, _7, _8);
145+
}
146+
147+
@Override
148+
public Tuple8<_2, _3, _4, _1, _5, _6, _7, _8> rotateL4() {
149+
return tuple(_2, _3, _4, _1, _5, _6, _7, _8);
150+
}
151+
152+
@Override
153+
public Tuple8<_4, _1, _2, _3, _5, _6, _7, _8> rotateR4() {
154+
return tuple(_4, _1, _2, _3, _5, _6, _7, _8);
155+
}
156+
157+
@Override
158+
public Tuple8<_2, _3, _1, _4, _5, _6, _7, _8> rotateL3() {
159+
return tuple(_2, _3, _1, _4, _5, _6, _7, _8);
160+
}
161+
162+
@Override
163+
public Tuple8<_3, _1, _2, _4, _5, _6, _7, _8> rotateR3() {
164+
return tuple(_3, _1, _2, _4, _5, _6, _7, _8);
165+
}
166+
167+
@Override
168+
public Tuple8<_2, _1, _3, _4, _5, _6, _7, _8> invert() {
169+
return tuple(_2, _1, _3, _4, _5, _6, _7, _8);
170+
}
171+
107172
@Override
108173
public <_8Prime> Tuple8<_1, _2, _3, _4, _5, _6, _7, _8Prime> fmap(Function<? super _8, ? extends _8Prime> fn) {
109174
return Monad.super.<_8Prime>fmap(fn).coerce();

src/main/java/com/jnape/palatable/lambda/adt/product/Product2.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ default <R> R into(BiFunction<? super _1, ? super _2, ? extends R> fn) {
4444
}
4545

4646
/**
47-
* Flip the slots of this {@link Product2}.
47+
* Rotate the first two slots of this product.
4848
*
49-
* @return the flipped {@link Product2}
49+
* @return the rotated product
5050
*/
5151
default Product2<_2, _1> invert() {
5252
return into((_1, _2) -> product(_2, _1));

src/main/java/com/jnape/palatable/lambda/adt/product/Product3.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,57 @@ public interface Product3<_1, _2, _3> extends Product2<_1, _2> {
3232
default <R> R into(Fn3<? super _1, ? super _2, ? super _3, ? extends R> fn) {
3333
return Product2.super.into(fn.toBiFunction()).apply(_3());
3434
}
35+
36+
/**
37+
* Rotate the first three values of this product one slot to the left.
38+
*
39+
* @return the left-rotated product
40+
*/
41+
default Product3<_2, _3, _1> rotateL3() {
42+
return into((_1, _2, _3) -> product(_2, _3, _1));
43+
}
44+
45+
/**
46+
* Rotate the first three values of this product one slot to the right.
47+
*
48+
* @return the right-rotated product
49+
*/
50+
default Product3<_3, _1, _2> rotateR3() {
51+
return into((_1, _2, _3) -> product(_3, _1, _2));
52+
}
53+
54+
@Override
55+
default Product3<_2, _1, _3> invert() {
56+
return into((_1, _2, _3) -> product(_2, _1, _3));
57+
}
58+
59+
/**
60+
* Static factory method for creating a generic {@link Product3}.
61+
*
62+
* @param _1 the first slot
63+
* @param _2 the second slot
64+
* @param _3 the third slot
65+
* @param <_1> the first slot type
66+
* @param <_2> the second slot type
67+
* @param <_3> the third slot type
68+
* @return the {@link Product3}
69+
*/
70+
static <_1, _2, _3> Product3<_1, _2, _3> product(_1 _1, _2 _2, _3 _3) {
71+
return new Product3<_1, _2, _3>() {
72+
@Override
73+
public _1 _1() {
74+
return _1;
75+
}
76+
77+
@Override
78+
public _2 _2() {
79+
return _2;
80+
}
81+
82+
@Override
83+
public _3 _3() {
84+
return _3;
85+
}
86+
};
87+
}
3588
}

0 commit comments

Comments
 (0)