Skip to content

Commit b600ab7

Browse files
committed
Choice2-8 return tuples
1 parent d2d3ce5 commit b600ab7

File tree

8 files changed

+111
-1
lines changed

8 files changed

+111
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
1515
- `Tuple2-8` now implement `Product2-8`
1616
- `Into2-8` now accepts a product of the same cardinality, instead of requiring a tuple
1717
- `CoProduct2-8#project` now return generalized products
18+
- `Choice2-8#project` return tuples
1819

1920
## [3.0.3] - 2018-05-27
2021
### Added

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice2.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

33
import com.jnape.palatable.lambda.adt.Either;
4+
import com.jnape.palatable.lambda.adt.Maybe;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct2;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple2;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into.into;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct2}. Unlike {@link Either}, there is no concept of "success" or
1520
* "failure", so the domain of reasonable function semantics is more limited.
@@ -19,11 +24,25 @@
1924
* @see Either
2025
* @see Choice3
2126
*/
22-
public abstract class Choice2<A, B> implements CoProduct2<A, B, Choice2<A, B>>, Monad<B, Choice2<A, ?>>, Bifunctor<A, B, Choice2>, Traversable<B, Choice2<A, ?>> {
27+
public abstract class Choice2<A, B> implements
28+
CoProduct2<A, B, Choice2<A, B>>,
29+
Monad<B, Choice2<A, ?>>,
30+
Bifunctor<A, B, Choice2>,
31+
Traversable<B, Choice2<A, ?>> {
2332

2433
private Choice2() {
2534
}
2635

36+
/**
37+
* Specialize this choice's projection to a {@link Tuple2}.
38+
*
39+
* @return a {@link Tuple2}
40+
*/
41+
@Override
42+
public Tuple2<Maybe<A>, Maybe<B>> project() {
43+
return into(HList::tuple, CoProduct2.super.project());
44+
}
45+
2746
@Override
2847
public final <C> Choice3<A, B, C> diverge() {
2948
return match(Choice3::a, Choice3::b);

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice3.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

3+
import com.jnape.palatable.lambda.adt.Maybe;
34
import com.jnape.palatable.lambda.adt.coproduct.CoProduct2;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct3;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple3;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into3.into3;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct3}.
1520
*
@@ -28,6 +33,16 @@ public abstract class Choice3<A, B, C> implements
2833
private Choice3() {
2934
}
3035

36+
/**
37+
* Specialize this choice's projection to a {@link Tuple3}.
38+
*
39+
* @return a {@link Tuple3}
40+
*/
41+
@Override
42+
public Tuple3<Maybe<A>, Maybe<B>, Maybe<C>> project() {
43+
return into3(HList::tuple, CoProduct3.super.project());
44+
}
45+
3146
@Override
3247
public final <D> Choice4<A, B, C, D> diverge() {
3348
return match(Choice4::a, Choice4::b, Choice4::c);

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice4.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

3+
import com.jnape.palatable.lambda.adt.Maybe;
34
import com.jnape.palatable.lambda.adt.coproduct.CoProduct3;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct4;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple4;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into4.into4;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct4}.
1520
*
@@ -29,6 +34,16 @@ public abstract class Choice4<A, B, C, D> implements
2934
private Choice4() {
3035
}
3136

37+
/**
38+
* Specialize this choice's projection to a {@link Tuple4}.
39+
*
40+
* @return a {@link Tuple4}
41+
*/
42+
@Override
43+
public Tuple4<Maybe<A>, Maybe<B>, Maybe<C>, Maybe<D>> project() {
44+
return into4(HList::tuple, CoProduct4.super.project());
45+
}
46+
3247
@Override
3348
public <E> Choice5<A, B, C, D, E> diverge() {
3449
return match(Choice5::a, Choice5::b, Choice5::c, Choice5::d);

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice5.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

3+
import com.jnape.palatable.lambda.adt.Maybe;
34
import com.jnape.palatable.lambda.adt.coproduct.CoProduct4;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct5;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple5;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into5.into5;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct5}.
1520
*
@@ -30,6 +35,16 @@ public abstract class Choice5<A, B, C, D, E> implements
3035
private Choice5() {
3136
}
3237

38+
/**
39+
* Specialize this choice's projection to a {@link Tuple5}.
40+
*
41+
* @return a {@link Tuple5}
42+
*/
43+
@Override
44+
public Tuple5<Maybe<A>, Maybe<B>, Maybe<C>, Maybe<D>, Maybe<E>> project() {
45+
return into5(HList::tuple, CoProduct5.super.project());
46+
}
47+
3348
@Override
3449
public <F> Choice6<A, B, C, D, E, F> diverge() {
3550
return match(Choice6::a, Choice6::b, Choice6::c, Choice6::d, Choice6::e);

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice6.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

3+
import com.jnape.palatable.lambda.adt.Maybe;
34
import com.jnape.palatable.lambda.adt.coproduct.CoProduct5;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct6;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple6;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into6.into6;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct6}.
1520
*
@@ -31,6 +36,16 @@ public abstract class Choice6<A, B, C, D, E, F> implements
3136
private Choice6() {
3237
}
3338

39+
/**
40+
* Specialize this choice's projection to a {@link Tuple6}.
41+
*
42+
* @return a {@link Tuple6}
43+
*/
44+
@Override
45+
public Tuple6<Maybe<A>, Maybe<B>, Maybe<C>, Maybe<D>, Maybe<E>, Maybe<F>> project() {
46+
return into6(HList::tuple, CoProduct6.super.project());
47+
}
48+
3449
@Override
3550
public <G> Choice7<A, B, C, D, E, F, G> diverge() {
3651
return match(Choice7::a, Choice7::b, Choice7::c, Choice7::d, Choice7::e, Choice7::f);

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice7.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

3+
import com.jnape.palatable.lambda.adt.Maybe;
34
import com.jnape.palatable.lambda.adt.coproduct.CoProduct6;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct7;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple7;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into7.into7;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct7}.
1520
*
@@ -32,6 +37,16 @@ public abstract class Choice7<A, B, C, D, E, F, G> implements
3237
private Choice7() {
3338
}
3439

40+
/**
41+
* Specialize this choice's projection to a {@link Tuple7}.
42+
*
43+
* @return a {@link Tuple7}
44+
*/
45+
@Override
46+
public Tuple7<Maybe<A>, Maybe<B>, Maybe<C>, Maybe<D>, Maybe<E>, Maybe<F>, Maybe<G>> project() {
47+
return into7(HList::tuple, CoProduct7.super.project());
48+
}
49+
3550
@Override
3651
public <H> Choice8<A, B, C, D, E, F, G, H> diverge() {
3752
return match(Choice8::a, Choice8::b, Choice8::c, Choice8::d, Choice8::e, Choice8::f, Choice8::g);

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice8.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.adt.choice;
22

3+
import com.jnape.palatable.lambda.adt.Maybe;
34
import com.jnape.palatable.lambda.adt.coproduct.CoProduct7;
45
import com.jnape.palatable.lambda.adt.coproduct.CoProduct8;
6+
import com.jnape.palatable.lambda.adt.hlist.HList;
7+
import com.jnape.palatable.lambda.adt.hlist.Tuple8;
58
import com.jnape.palatable.lambda.functor.Applicative;
69
import com.jnape.palatable.lambda.functor.Bifunctor;
710
import com.jnape.palatable.lambda.monad.Monad;
@@ -10,6 +13,8 @@
1013
import java.util.Objects;
1114
import java.util.function.Function;
1215

16+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into8.into8;
17+
1318
/**
1419
* Canonical ADT representation of {@link CoProduct8}.
1520
*
@@ -32,6 +37,16 @@ public abstract class Choice8<A, B, C, D, E, F, G, H> implements
3237
private Choice8() {
3338
}
3439

40+
/**
41+
* Specialize this choice's projection to a {@link Tuple8}.
42+
*
43+
* @return a {@link Tuple8}
44+
*/
45+
@Override
46+
public Tuple8<Maybe<A>, Maybe<B>, Maybe<C>, Maybe<D>, Maybe<E>, Maybe<F>, Maybe<G>, Maybe<H>> project() {
47+
return into8(HList::tuple, CoProduct8.super.project());
48+
}
49+
3550
@Override
3651
public Choice7<A, B, C, D, E, F, G> converge(
3752
Function<? super H, ? extends CoProduct7<A, B, C, D, E, F, G, ?>> convergenceFn) {

0 commit comments

Comments
 (0)