X Tutup
Skip to content

Commit b2d929d

Browse files
committed
Traversable arrives
1 parent 5be2bd8 commit b2d929d

File tree

33 files changed

+457
-33
lines changed

33 files changed

+457
-33
lines changed

src/main/java/com/jnape/palatable/lambda/adt/Either.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jnape.palatable.lambda.functions.specialized.checked.CheckedSupplier;
66
import com.jnape.palatable.lambda.functor.Applicative;
77
import com.jnape.palatable.lambda.functor.Bifunctor;
8+
import com.jnape.palatable.lambda.traversable.Traversable;
89

910
import java.util.Objects;
1011
import java.util.Optional;
@@ -25,7 +26,7 @@
2526
* @param <L> The left parameter type
2627
* @param <R> The right parameter type
2728
*/
28-
public abstract class Either<L, R> implements CoProduct2<L, R, Either<L, R>>, Applicative<R, Either<L, ?>>, Bifunctor<L, R, Either> {
29+
public abstract class Either<L, R> implements CoProduct2<L, R, Either<L, R>>, Applicative<R, Either<L, ?>>, Traversable<R, Either<L, ?>>, Bifunctor<L, R, Either> {
2930

3031
private Either() {
3132
}
@@ -234,6 +235,14 @@ public <R2> Either<L, R> discardR(Applicative<R2, Either<L, ?>> appB) {
234235
return Applicative.super.discardR(appB).coerce();
235236
}
236237

238+
@Override
239+
public <R2, App extends Applicative> Applicative<Either<L, R2>, App> traverse(
240+
Function<? super R, ? extends Applicative<R2, App>> fn,
241+
Function<? super Traversable<R2, Either<L, ?>>, ? extends Applicative<? extends Traversable<R2, Either<L, ?>>, App>> pure) {
242+
return match(l -> pure.apply(left(l)).fmap(x -> (Either<L, R2>) x),
243+
r -> fn.apply(r).fmap(Either::right));
244+
}
245+
237246
/**
238247
* In the left case, returns an {@link Optional#empty}; otherwise, returns {@link Optional#ofNullable} around the
239248
* right value.

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jnape.palatable.lambda.functor.Applicative;
66
import com.jnape.palatable.lambda.functor.Bifunctor;
77
import com.jnape.palatable.lambda.functor.Functor;
8+
import com.jnape.palatable.lambda.traversable.Traversable;
89

910
import java.util.Objects;
1011
import java.util.function.Function;
@@ -19,7 +20,7 @@
1920
* @see Either
2021
* @see Choice3
2122
*/
22-
public abstract class Choice2<A, B> implements CoProduct2<A, B, Choice2<A, B>>, Applicative<B, Choice2<A, ?>>, Bifunctor<A, B, Choice2> {
23+
public abstract class Choice2<A, B> implements CoProduct2<A, B, Choice2<A, B>>, Applicative<B, Choice2<A, ?>>, Bifunctor<A, B, Choice2>, Traversable<B, Choice2<A, ?>> {
2324

2425
private Choice2() {
2526
}
@@ -79,6 +80,14 @@ public <C> Choice2<A, B> discardR(Applicative<C, Choice2<A, ?>> appB) {
7980
return Applicative.super.discardR(appB).coerce();
8081
}
8182

83+
@Override
84+
public <C, App extends Applicative> Applicative<Choice2<A, C>, App> traverse(
85+
Function<? super B, ? extends Applicative<C, App>> fn,
86+
Function<? super Traversable<C, Choice2<A, ?>>, ? extends Applicative<? extends Traversable<C, Choice2<A, ?>>, App>> pure) {
87+
return match(a -> pure.apply(a(a)).fmap(x -> (Choice2<A, C>) x),
88+
b -> fn.apply(b).fmap(Choice2::b));
89+
}
90+
8291
/**
8392
* Static factory method for wrapping a value of type <code>A</code> in a {@link Choice2}.
8493
*

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jnape.palatable.lambda.functor.Applicative;
66
import com.jnape.palatable.lambda.functor.Bifunctor;
77
import com.jnape.palatable.lambda.functor.Functor;
8+
import com.jnape.palatable.lambda.traversable.Traversable;
89

910
import java.util.Objects;
1011
import java.util.function.Function;
@@ -18,7 +19,11 @@
1819
* @see Choice2
1920
* @see Choice4
2021
*/
21-
public abstract class Choice3<A, B, C> implements CoProduct3<A, B, C, Choice3<A, B, C>>, Applicative<C, Choice3<A, B, ?>>, Bifunctor<B, C, Choice3<A, ?, ?>> {
22+
public abstract class Choice3<A, B, C> implements
23+
CoProduct3<A, B, C, Choice3<A, B, C>>,
24+
Applicative<C, Choice3<A, B, ?>>,
25+
Bifunctor<B, C, Choice3<A, ?, ?>>,
26+
Traversable<C, Choice3<A, B, ?>> {
2227

2328
private Choice3() {
2429
}
@@ -63,8 +68,7 @@ public <D> Choice3<A, B, D> pure(D d) {
6368
}
6469

6570
@Override
66-
public <D> Choice3<A, B, D> zip(
67-
Applicative<Function<? super C, ? extends D>, Choice3<A, B, ?>> appFn) {
71+
public <D> Choice3<A, B, D> zip(Applicative<Function<? super C, ? extends D>, Choice3<A, B, ?>> appFn) {
6872
return appFn.<Choice3<A, B, Function<? super C, ? extends D>>>coerce()
6973
.match(Choice3::a, Choice3::b, this::biMapR);
7074
}
@@ -79,6 +83,15 @@ public <D> Choice3<A, B, C> discardR(Applicative<D, Choice3<A, B, ?>> appB) {
7983
return Applicative.super.discardR(appB).coerce();
8084
}
8185

86+
@Override
87+
public <D, App extends Applicative> Applicative<Choice3<A, B, D>, App> traverse(
88+
Function<? super C, ? extends Applicative<D, App>> fn,
89+
Function<? super Traversable<D, Choice3<A, B, ?>>, ? extends Applicative<? extends Traversable<D, Choice3<A, B, ?>>, App>> pure) {
90+
return match(a -> pure.apply(a(a)).fmap(x -> (Choice3<A, B, D>) x),
91+
b -> pure.apply(b(b)).fmap(x -> (Choice3<A, B, D>) x),
92+
c -> fn.apply(c).fmap(Choice3::c));
93+
}
94+
8295
/**
8396
* Static factory method for wrapping a value of type <code>A</code> in a {@link Choice3}.
8497
*

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jnape.palatable.lambda.functor.Applicative;
66
import com.jnape.palatable.lambda.functor.Bifunctor;
77
import com.jnape.palatable.lambda.functor.Functor;
8+
import com.jnape.palatable.lambda.traversable.Traversable;
89

910
import java.util.Objects;
1011
import java.util.function.Function;
@@ -19,7 +20,11 @@
1920
* @see Choice3
2021
* @see Choice5
2122
*/
22-
public abstract class Choice4<A, B, C, D> implements CoProduct4<A, B, C, D, Choice4<A, B, C, D>>, Applicative<D, Choice4<A, B, C, ?>>, Bifunctor<C, D, Choice4<A, B, ?, ?>> {
23+
public abstract class Choice4<A, B, C, D> implements
24+
CoProduct4<A, B, C, D, Choice4<A, B, C, D>>,
25+
Applicative<D, Choice4<A, B, C, ?>>,
26+
Bifunctor<C, D, Choice4<A, B, ?, ?>>,
27+
Traversable<D, Choice4<A, B, C, ?>> {
2328

2429
private Choice4() {
2530
}
@@ -82,6 +87,16 @@ public <E> Choice4<A, B, C, D> discardR(Applicative<E, Choice4<A, B, C, ?>> appB
8287
return Applicative.super.discardR(appB).coerce();
8388
}
8489

90+
@Override
91+
public <E, App extends Applicative> Applicative<Choice4<A, B, C, E>, App> traverse(
92+
Function<? super D, ? extends Applicative<E, App>> fn,
93+
Function<? super Traversable<E, Choice4<A, B, C, ?>>, ? extends Applicative<? extends Traversable<E, Choice4<A, B, C, ?>>, App>> pure) {
94+
return match(a -> pure.apply(a(a)).fmap(x -> (Choice4<A, B, C, E>) x),
95+
b -> pure.apply(b(b)).fmap(x -> (Choice4<A, B, C, E>) x),
96+
c -> pure.apply(c(c)).fmap(x -> (Choice4<A, B, C, E>) x),
97+
d -> fn.apply(d).fmap(Choice4::d));
98+
}
99+
85100
/**
86101
* Static factory method for wrapping a value of type <code>A</code> in a {@link Choice4}.
87102
*

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.jnape.palatable.lambda.functor.Applicative;
66
import com.jnape.palatable.lambda.functor.Bifunctor;
77
import com.jnape.palatable.lambda.functor.Functor;
8+
import com.jnape.palatable.lambda.traversable.Traversable;
89

910
import java.util.Objects;
1011
import java.util.function.Function;
@@ -19,7 +20,11 @@
1920
* @param <E> a type parameter representing the fifth possible type of this choice
2021
* @see Choice4
2122
*/
22-
public abstract class Choice5<A, B, C, D, E> implements CoProduct5<A, B, C, D, E, Choice5<A, B, C, D, E>>, Applicative<E, Choice5<A, B, C, D, ?>>, Bifunctor<D, E, Choice5<A, B, C, ?, ?>> {
23+
public abstract class Choice5<A, B, C, D, E> implements
24+
CoProduct5<A, B, C, D, E, Choice5<A, B, C, D, E>>,
25+
Applicative<E, Choice5<A, B, C, D, ?>>,
26+
Bifunctor<D, E, Choice5<A, B, C, ?, ?>>,
27+
Traversable<E, Choice5<A, B, C, D, ?>> {
2328

2429
private Choice5() {
2530
}
@@ -78,6 +83,17 @@ public <F> Choice5<A, B, C, D, E> discardR(Applicative<F, Choice5<A, B, C, D, ?>
7883
return Applicative.super.discardR(appB).coerce();
7984
}
8085

86+
@Override
87+
public <F, App extends Applicative> Applicative<Choice5<A, B, C, D, F>, App> traverse(
88+
Function<? super E, ? extends Applicative<F, App>> fn,
89+
Function<? super Traversable<F, Choice5<A, B, C, D, ?>>, ? extends Applicative<? extends Traversable<F, Choice5<A, B, C, D, ?>>, App>> pure) {
90+
return match(a -> pure.apply(a(a)).fmap(x -> (Choice5<A, B, C, D, F>) x),
91+
b -> pure.apply(b(b)).fmap(x -> (Choice5<A, B, C, D, F>) x),
92+
c -> pure.apply(c(c)).fmap(x -> (Choice5<A, B, C, D, F>) x),
93+
d -> pure.apply(d(d)).fmap(x -> (Choice5<A, B, C, D, F>) x),
94+
e -> fn.apply(e).fmap(Choice5::e));
95+
}
96+
8197
/**
8298
* Static factory method for wrapping a value of type <code>A</code> in a {@link Choice5}.
8399
*

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
44
import com.jnape.palatable.lambda.adt.hlist.HList.HNil;
55
import com.jnape.palatable.lambda.functor.Applicative;
6+
import com.jnape.palatable.lambda.traversable.Traversable;
67

78
import java.util.function.Function;
89

@@ -16,7 +17,7 @@
1617
* @see Tuple4
1718
* @see Tuple5
1819
*/
19-
public class SingletonHList<_1> extends HCons<_1, HNil> implements Applicative<_1, SingletonHList> {
20+
public class SingletonHList<_1> extends HCons<_1, HNil> implements Applicative<_1, SingletonHList>, Traversable<_1, SingletonHList> {
2021

2122
SingletonHList(_1 _1) {
2223
super(_1, nil());
@@ -55,4 +56,11 @@ public <_1Prime> SingletonHList<_1Prime> discardL(Applicative<_1Prime, Singleton
5556
public <_1Prime> SingletonHList<_1> discardR(Applicative<_1Prime, SingletonHList> appB) {
5657
return Applicative.super.discardR(appB).coerce();
5758
}
59+
60+
@Override
61+
public <_1Prime, App extends Applicative> Applicative<SingletonHList<_1Prime>, App> traverse(
62+
Function<? super _1, ? extends Applicative<_1Prime, App>> fn,
63+
Function<? super Traversable<_1Prime, SingletonHList>, ? extends Applicative<? extends Traversable<_1Prime, SingletonHList>, App>> pure) {
64+
return fn.apply(head()).fmap(SingletonHList::new);
65+
}
5866
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
44
import com.jnape.palatable.lambda.functor.Applicative;
55
import com.jnape.palatable.lambda.functor.Bifunctor;
6+
import com.jnape.palatable.lambda.traversable.Traversable;
67

78
import java.util.Map;
89
import java.util.function.BiFunction;
910
import java.util.function.Function;
1011

12+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
13+
1114
/**
1215
* A 2-element tuple product type, implemented as a specialized HList. Supports random access.
1316
*
@@ -20,7 +23,7 @@
2023
* @see Tuple5
2124
*/
2225
public class Tuple2<_1, _2> extends HCons<_1, SingletonHList<_2>>
23-
implements Map.Entry<_1, _2>, Applicative<_2, Tuple2<_1, ?>>, Bifunctor<_1, _2, Tuple2> {
26+
implements Map.Entry<_1, _2>, Applicative<_2, Tuple2<_1, ?>>, Bifunctor<_1, _2, Tuple2>, Traversable<_2, Tuple2<_1, ?>> {
2427

2528
private final _1 _1;
2629
private final _2 _2;
@@ -126,6 +129,13 @@ public <_2Prime> Tuple2<_1, _2> discardR(Applicative<_2Prime, Tuple2<_1, ?>> app
126129
return Applicative.super.discardR(appB).coerce();
127130
}
128131

132+
@Override
133+
public <_2Prime, App extends Applicative> Applicative<Tuple2<_1, _2Prime>, App> traverse(
134+
Function<? super _2, ? extends Applicative<_2Prime, App>> fn,
135+
Function<? super Traversable<_2Prime, Tuple2<_1, ?>>, ? extends Applicative<? extends Traversable<_2Prime, Tuple2<_1, ?>>, App>> pure) {
136+
return fn.apply(_2).fmap(_2Prime -> fmap(constantly(_2Prime)));
137+
}
138+
129139
/**
130140
* Static factory method for creating <code>Tuple2</code>s from {@link java.util.Map.Entry}s.
131141
*

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import com.jnape.palatable.lambda.functions.Fn3;
55
import com.jnape.palatable.lambda.functor.Applicative;
66
import com.jnape.palatable.lambda.functor.Bifunctor;
7+
import com.jnape.palatable.lambda.traversable.Traversable;
78

89
import java.util.function.Function;
910

11+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
12+
1013
/**
1114
* A 3-element tuple product type, implemented as a specialized HList. Supports random access.
1215
*
@@ -20,7 +23,7 @@
2023
* @see Tuple5
2124
*/
2225
public class Tuple3<_1, _2, _3> extends HCons<_1, Tuple2<_2, _3>>
23-
implements Applicative<_3, Tuple3<_1, _2, ?>>, Bifunctor<_2, _3, Tuple3<_1, ?, ?>> {
26+
implements Applicative<_3, Tuple3<_1, _2, ?>>, Bifunctor<_2, _3, Tuple3<_1, ?, ?>>, Traversable<_3, Tuple3<_1, _2, ?>> {
2427
private final _1 _1;
2528
private final _2 _2;
2629
private final _3 _3;
@@ -122,6 +125,13 @@ public <_3Prime> Tuple3<_1, _2, _3> discardR(Applicative<_3Prime, Tuple3<_1, _2,
122125
return Applicative.super.discardR(appB).coerce();
123126
}
124127

128+
@Override
129+
public <_3Prime, App extends Applicative> Applicative<Tuple3<_1, _2, _3Prime>, App> traverse(
130+
Function<? super _3, ? extends Applicative<_3Prime, App>> fn,
131+
Function<? super Traversable<_3Prime, Tuple3<_1, _2, ?>>, ? extends Applicative<? extends Traversable<_3Prime, Tuple3<_1, _2, ?>>, App>> pure) {
132+
return fn.apply(_3).fmap(_3Prime -> fmap(constantly(_3Prime)));
133+
}
134+
125135
/**
126136
* Given a value of type <code>A</code>, produced an instance of this tuple with each slot set to that value.
127137
*

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import com.jnape.palatable.lambda.functions.Fn4;
55
import com.jnape.palatable.lambda.functor.Applicative;
66
import com.jnape.palatable.lambda.functor.Bifunctor;
7+
import com.jnape.palatable.lambda.traversable.Traversable;
78

89
import java.util.function.Function;
910

11+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
12+
1013
/**
1114
* A 4-element tuple product type, implemented as a specialized HList. Supports random access.
1215
*
@@ -21,7 +24,7 @@
2124
* @see Tuple5
2225
*/
2326
public class Tuple4<_1, _2, _3, _4> extends HCons<_1, Tuple3<_2, _3, _4>>
24-
implements Applicative<_4, Tuple4<_1, _2, _3, ?>>, Bifunctor<_3, _4, Tuple4<_1, _2, ?, ?>> {
27+
implements Applicative<_4, Tuple4<_1, _2, _3, ?>>, Bifunctor<_3, _4, Tuple4<_1, _2, ?, ?>>, Traversable<_4, Tuple4<_1, _2, _3, ?>> {
2528
private final _1 _1;
2629
private final _2 _2;
2730
private final _3 _3;
@@ -134,6 +137,13 @@ public <_4Prime> Tuple4<_1, _2, _3, _4> discardR(Applicative<_4Prime, Tuple4<_1,
134137
return Applicative.super.discardR(appB).coerce();
135138
}
136139

140+
@Override
141+
public <_4Prime, App extends Applicative> Applicative<Tuple4<_1, _2, _3, _4Prime>, App> traverse(
142+
Function<? super _4, ? extends Applicative<_4Prime, App>> fn,
143+
Function<? super Traversable<_4Prime, Tuple4<_1, _2, _3, ?>>, ? extends Applicative<? extends Traversable<_4Prime, Tuple4<_1, _2, _3, ?>>, App>> pure) {
144+
return fn.apply(_4).fmap(_4Prime -> fmap(constantly(_4Prime)));
145+
}
146+
137147
/**
138148
* Given a value of type <code>A</code>, produced an instance of this tuple with each slot set to that value.
139149
*

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
44
import com.jnape.palatable.lambda.functor.Applicative;
55
import com.jnape.palatable.lambda.functor.Bifunctor;
6+
import com.jnape.palatable.lambda.traversable.Traversable;
67

78
import java.util.function.Function;
89

10+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
11+
912
/**
1013
* A 5-element tuple product type, implemented as a specialized HList. Supports random access.
1114
*
@@ -21,7 +24,7 @@
2124
* @see Tuple4
2225
*/
2326
public class Tuple5<_1, _2, _3, _4, _5> extends HCons<_1, Tuple4<_2, _3, _4, _5>>
24-
implements Applicative<_5, Tuple5<_1, _2, _3, _4, ?>>, Bifunctor<_4, _5, Tuple5<_1, _2, _3, ?, ?>> {
27+
implements Applicative<_5, Tuple5<_1, _2, _3, _4, ?>>, Bifunctor<_4, _5, Tuple5<_1, _2, _3, ?, ?>>, Traversable<_5, Tuple5<_1, _2, _3, _4, ?>> {
2528
private final _1 _1;
2629
private final _2 _2;
2730
private final _3 _3;
@@ -132,6 +135,13 @@ public <_5Prime> Tuple5<_1, _2, _3, _4, _5> discardR(Applicative<_5Prime, Tuple5
132135
return Applicative.super.discardR(appB).coerce();
133136
}
134137

138+
@Override
139+
public <_5Prime, App extends Applicative> Applicative<Tuple5<_1, _2, _3, _4, _5Prime>, App> traverse(
140+
Function<? super _5, ? extends Applicative<_5Prime, App>> fn,
141+
Function<? super Traversable<_5Prime, Tuple5<_1, _2, _3, _4, ?>>, ? extends Applicative<? extends Traversable<_5Prime, Tuple5<_1, _2, _3, _4, ?>>, App>> pure) {
142+
return fn.apply(_5).fmap(_5Prime -> fmap(constantly(_5Prime)));
143+
}
144+
135145
/**
136146
* Given a value of type <code>A</code>, produced an instance of this tuple with each slot set to that value.
137147
*

0 commit comments

Comments
 (0)
X Tutup