Skip to content

Commit e0cc5cd

Browse files
committed
more progress
1 parent 816475e commit e0cc5cd

File tree

4 files changed

+118
-102
lines changed

4 files changed

+118
-102
lines changed

src/main/java/com/jnape/palatable/lambda/Spike.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import java.util.function.BiFunction;
1616
import java.util.function.Function;
1717

18-
import static com.jnape.palatable.lambda.adt.Either.right;
1918
import static com.jnape.palatable.lambda.adt.Maybe.just;
2019
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
2120
import static com.jnape.palatable.lambda.functions.Fn2.fn2;
@@ -24,8 +23,9 @@
2423
import static com.jnape.palatable.lambda.structural.Cases.cases;
2524
import static com.jnape.palatable.lambda.structural.Matcher.$;
2625
import static com.jnape.palatable.lambda.structural.Matchers.$just;
27-
import static com.jnape.palatable.lambda.structural.Matchers.Any.$__;
26+
import static com.jnape.palatable.lambda.structural.Matchers.$right;
2827
import static com.jnape.palatable.lambda.structural.Struct.struct;
28+
import static java.lang.Integer.parseInt;
2929

3030
public class Spike {
3131

@@ -107,10 +107,6 @@ public static <A, B, C, D, E, F, G, H, R, App extends Applicative, AppR extends
107107

108108

109109
public static void main(String[] args) {
110-
111-
Either<Object, Integer> foo1 = liftA(right(1), right(2), right(3), right(4), (a, b, c, d) -> a + b + c + d);
112-
System.out.println(foo1);
113-
114110
class Foo implements Struct._4<String, Maybe<Integer>, String, Maybe<Integer>> {
115111

116112
@Override
@@ -129,12 +125,18 @@ public Maybe<Integer> getBaz() {
129125

130126
Foo foo = new Foo();
131127

128+
String match1 = struct(() -> Either.<String, Integer>right(2), () -> "foo")
129+
.match(cases(of($right(1), $(), (x, y) -> x + y),
130+
of($(), $(), (x, y) -> x + y)));
131+
132+
System.out.println(match1);
133+
132134
Integer match = struct(foo::getBar, foo::getBaz).match(cases(
133-
of($(eq("123")), $just(), (bar, baz) -> Integer.parseInt(bar) + baz),
134-
of($(eq("foo")), $__(), (bar, baz) -> baz.orElse(-2)),
135+
of($(eq("123")), $just(), (bar1, baz1) -> parseInt(bar1) + baz1),
136+
of($(eq("foo")), $(), (bar, baz) -> 1),
135137
of($(eq("foo")), $(just(1)), (bar, baz) -> baz.orElse(-2)),
136-
of($(eq("foo")), $just(1), (bar, baz) -> baz),
137-
of($__(), $__(), (bar, baz) -> -1)));
138+
of($(eq("foo")), $just(1), (bar, baz) -> -2),
139+
of($(), $(), (a, b) -> -1)));
138140

139141
System.out.println("match = " + match);
140142
}

src/main/java/com/jnape/palatable/lambda/structural/Case.java

Lines changed: 63 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@
1717
import com.jnape.palatable.lambda.functions.Fn6;
1818
import com.jnape.palatable.lambda.functions.Fn7;
1919
import com.jnape.palatable.lambda.functions.Fn8;
20-
import com.jnape.palatable.lambda.structural.Matchers.Any;
20+
import com.jnape.palatable.lambda.structural.Matcher.Any;
2121

2222
import java.util.function.BiFunction;
2323
import java.util.function.Function;
2424

25+
import static com.jnape.palatable.lambda.Spike.liftA;
2526
import static com.jnape.palatable.lambda.adt.Maybe.just;
2627
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into.into;
2728
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into1.into1;
@@ -122,81 +123,81 @@ public static <A, B, C, R> Total<Tuple3<A, B, C>, R> of(Any<A> __,
122123
}
123124

124125
@SuppressWarnings({"RedundantTypeArguments", "unused"})
125-
public static <A, B, C, D, R> Total<Tuple4<A, B, C, D>, R> of(Any __,
126-
Any ___,
127-
Any ____,
128-
Any _____,
126+
public static <A, B, C, D, R> Total<Tuple4<A, B, C, D>, R> of(Any<A> __,
127+
Any<B> ___,
128+
Any<C> ____,
129+
Any<D> _____,
129130
Fn4<? super A, ? super B, ? super C, ? super D, ? extends R> fn) {
130131
return Case.<A, B, C, D, R>of(fn);
131132
}
132133

133134
@SuppressWarnings({"RedundantTypeArguments", "unused"})
134-
public static <A, B, C, D, E, R> Total<Tuple5<A, B, C, D, E>, R> of(Any __,
135-
Any ___,
136-
Any ____,
137-
Any _____,
138-
Any ______,
135+
public static <A, B, C, D, E, R> Total<Tuple5<A, B, C, D, E>, R> of(Any<A> __,
136+
Any<B> ___,
137+
Any<C> ____,
138+
Any<D> _____,
139+
Any<E> ______,
139140
Fn5<? super A, ? super B, ? super C, ? super D, ? super E, ? extends R> fn) {
140141
return Case.<A, B, C, D, E, R>of(fn);
141142
}
142143

143144
@SuppressWarnings({"RedundantTypeArguments", "unused"})
144-
public static <A, B, C, D, E, F, R> Total<Tuple6<A, B, C, D, E, F>, R> of(Any __,
145-
Any ___,
146-
Any ____,
147-
Any _____,
148-
Any ______,
149-
Any _______,
145+
public static <A, B, C, D, E, F, R> Total<Tuple6<A, B, C, D, E, F>, R> of(Any<A> __,
146+
Any<B> ___,
147+
Any<C> ____,
148+
Any<D> _____,
149+
Any<E> ______,
150+
Any<F> _______,
150151
Fn6<? super A, ? super B, ? super C, ? super D, ? super E, ? super F, ? extends R> fn) {
151152
return Case.<A, B, C, D, E, F, R>of(fn);
152153
}
153154

154155
@SuppressWarnings({"RedundantTypeArguments", "unused"})
155-
public static <A, B, C, D, E, F, G, R> Total<Tuple7<A, B, C, D, E, F, G>, R> of(Any __,
156-
Any ___,
157-
Any ____,
158-
Any _____,
159-
Any ______,
160-
Any _______,
161-
Any ________,
156+
public static <A, B, C, D, E, F, G, R> Total<Tuple7<A, B, C, D, E, F, G>, R> of(Any<A> __,
157+
Any<B> ___,
158+
Any<C> ____,
159+
Any<D> _____,
160+
Any<E> ______,
161+
Any<F> _______,
162+
Any<G> ________,
162163
Fn7<? super A, ? super B, ? super C, ? super D, ? super E, ? super F, ? super G, ? extends R> fn) {
163164
return Case.<A, B, C, D, E, F, G, R>of(fn);
164165
}
165166

166167
@SuppressWarnings({"RedundantTypeArguments", "unused"})
167-
public static <A, B, C, D, E, F, G, H, R> Total<Tuple8<A, B, C, D, E, F, G, H>, R> of(Any __,
168-
Any ___,
169-
Any ____,
170-
Any _____,
171-
Any ______,
172-
Any _______,
173-
Any ________,
174-
Any _________,
168+
public static <A, B, C, D, E, F, G, H, R> Total<Tuple8<A, B, C, D, E, F, G, H>, R> of(Any<A> __,
169+
Any<B> ___,
170+
Any<C> ____,
171+
Any<D> _____,
172+
Any<E> ______,
173+
Any<F> _______,
174+
Any<G> ________,
175+
Any<H> _________,
175176
Fn8<? super A, ? super B, ? super C, ? super D, ? super E, ? super F, ? super G, ? super H, ? extends R> fn) {
176177
return Case.<A, B, C, D, E, F, G, H, R>of(fn);
177178
}
178179

179180

180181
public static <A, APrime, R> Partial<SingletonHList<A>, R> of(Matcher<? super A, ? extends APrime> aMatcher,
181182
Function<? super APrime, ? extends R> body) {
182-
return new Partial<>(into1(a -> aMatcher.apply(a).fmap(body)));
183+
return new Partial<>(into1(a -> aMatcher.match(a).fmap(body)));
183184
}
184185

185186
public static <A, APrime, B, BPrime, R> Partial<Tuple2<A, B>, R> of(
186187
Matcher<? super A, ? extends APrime> aMatcher,
187188
Matcher<? super B, ? extends BPrime> bMatcher,
188189
BiFunction<? super APrime, ? super BPrime, ? extends R> body) {
189-
return new Partial<>(into((a, b) -> aMatcher.apply(a).flatMap(aPrime -> bMatcher.apply(b).fmap(bPrime -> body.apply(aPrime, bPrime)))));
190+
return new Partial<>(into((a, b) -> aMatcher.match(a).flatMap(aPrime -> bMatcher.match(b).fmap(bPrime -> body.apply(aPrime, bPrime)))));
190191
}
191192

192193
public static <A, APrime, B, BPrime, C, CPrime, R> Partial<Tuple3<A, B, C>, R> of(
193194
Matcher<? super A, ? extends APrime> aMatcher,
194195
Matcher<? super B, ? extends BPrime> bMatcher,
195196
Matcher<? super C, ? extends CPrime> cMatcher,
196197
Fn3<? super APrime, ? super BPrime, ? super CPrime, ? extends R> body) {
197-
return new Partial<>(into3((a, b, c) -> aMatcher.apply(a)
198-
.flatMap(aPrime -> bMatcher.apply(b)
199-
.flatMap(bPrime -> cMatcher.apply(c)
198+
return new Partial<>(into3((a, b, c) -> aMatcher.match(a)
199+
.flatMap(aPrime -> bMatcher.match(b)
200+
.flatMap(bPrime -> cMatcher.match(c)
200201
.fmap(cPrime -> body.apply(aPrime, bPrime, cPrime))))));
201202
}
202203

@@ -206,10 +207,10 @@ public static <A, APrime, B, BPrime, C, CPrime, D, DPrime, R> Partial<Tuple4<A,
206207
Matcher<? super C, ? extends CPrime> cMatcher,
207208
Matcher<? super D, ? extends DPrime> dMatcher,
208209
Fn4<? super APrime, ? super BPrime, ? super CPrime, ? super DPrime, ? extends R> body) {
209-
return new Partial<>(into4((a, b, c, d) -> aMatcher.apply(a)
210-
.flatMap(aPrime -> bMatcher.apply(b)
211-
.flatMap(bPrime -> cMatcher.apply(c)
212-
.flatMap(cPrime -> dMatcher.apply(d)
210+
return new Partial<>(into4((a, b, c, d) -> aMatcher.match(a)
211+
.flatMap(aPrime -> bMatcher.match(b)
212+
.flatMap(bPrime -> cMatcher.match(c)
213+
.flatMap(cPrime -> dMatcher.match(d)
213214
.fmap(dPrime -> body.apply(aPrime, bPrime, cPrime, dPrime)))))));
214215
}
215216

@@ -221,11 +222,11 @@ public static <A, APrime, B, BPrime, C, CPrime, D, DPrime, E, EPrime, R> Partial
221222
Matcher<? super D, ? extends DPrime> dMatcher,
222223
Matcher<? super E, ? extends EPrime> eMatcher,
223224
Fn5<? super APrime, ? super BPrime, ? super CPrime, ? super DPrime, ? super EPrime, ? extends R> body) {
224-
return new Partial<>(into5((a, b, c, d, e) -> aMatcher.apply(a)
225-
.flatMap(aPrime -> bMatcher.apply(b)
226-
.flatMap(bPrime -> cMatcher.apply(c)
227-
.flatMap(cPrime -> dMatcher.apply(d)
228-
.flatMap(dPrime -> eMatcher.apply(e)
225+
return new Partial<>(into5((a, b, c, d, e) -> aMatcher.match(a)
226+
.flatMap(aPrime -> bMatcher.match(b)
227+
.flatMap(bPrime -> cMatcher.match(c)
228+
.flatMap(cPrime -> dMatcher.match(d)
229+
.flatMap(dPrime -> eMatcher.match(e)
229230
.fmap(ePrime -> body.apply(aPrime, bPrime, cPrime, dPrime, ePrime))))))));
230231
}
231232

@@ -237,15 +238,8 @@ public static <A, APrime, B, BPrime, C, CPrime, D, DPrime, E, EPrime, F, FPrime,
237238
Matcher<? super D, ? extends DPrime> dMatcher,
238239
Matcher<? super E, ? extends EPrime> eMatcher,
239240
Matcher<? super F, ? extends FPrime> fMatcher,
240-
Fn6<? super APrime, ? super BPrime, ? super CPrime, ? super DPrime, ? super EPrime, ? super FPrime, ? extends R> body) {
241-
//todo: for-comprehensions, lest any consumers needing to flatMap 6 levels deep instead choose death's sweet embrace
242-
return new Partial<>(into6((a, b, c, d, e, f) -> aMatcher.apply(a)
243-
.flatMap(aPrime -> bMatcher.apply(b)
244-
.flatMap(bPrime -> cMatcher.apply(c)
245-
.flatMap(cPrime -> dMatcher.apply(d)
246-
.flatMap(dPrime -> eMatcher.apply(e)
247-
.flatMap(ePrime -> fMatcher.apply(f)
248-
.fmap(fPrime -> body.apply(aPrime, bPrime, cPrime, dPrime, ePrime, fPrime)))))))));
241+
Fn6<? super APrime, ? super BPrime, ? super CPrime, ? super DPrime, ? super EPrime, ? super FPrime, R> body) {
242+
return new Partial<>(into6((a, b, c, d, e, f) -> liftA(aMatcher.match(a), bMatcher.match(b), cMatcher.match(c), dMatcher.match(d), eMatcher.match(e), fMatcher.match(f), body).coerce()));
249243
}
250244

251245
public static <A, APrime, B, BPrime, C, CPrime, D, DPrime, E, EPrime, F, FPrime, G, GPrime, R> Partial<Tuple7<A, B, C, D, E, F, G>, R> of(
@@ -257,13 +251,13 @@ public static <A, APrime, B, BPrime, C, CPrime, D, DPrime, E, EPrime, F, FPrime,
257251
Matcher<? super F, ? extends FPrime> fMatcher,
258252
Matcher<? super G, ? extends GPrime> gMatcher,
259253
Fn7<? super APrime, ? super BPrime, ? super CPrime, ? super DPrime, ? super EPrime, ? super FPrime, ? super GPrime, ? extends R> body) {
260-
return new Partial<>(into7((a, b, c, d, e, f, g) -> aMatcher.apply(a)
261-
.flatMap(aPrime -> bMatcher.apply(b)
262-
.flatMap(bPrime -> cMatcher.apply(c)
263-
.flatMap(cPrime -> dMatcher.apply(d)
264-
.flatMap(dPrime -> eMatcher.apply(e)
265-
.flatMap(ePrime -> fMatcher.apply(f)
266-
.flatMap(fPrime -> gMatcher.apply(g)
254+
return new Partial<>(into7((a, b, c, d, e, f, g) -> aMatcher.match(a)
255+
.flatMap(aPrime -> bMatcher.match(b)
256+
.flatMap(bPrime -> cMatcher.match(c)
257+
.flatMap(cPrime -> dMatcher.match(d)
258+
.flatMap(dPrime -> eMatcher.match(e)
259+
.flatMap(ePrime -> fMatcher.match(f)
260+
.flatMap(fPrime -> gMatcher.match(g)
267261
.fmap(gPrime -> body.apply(aPrime, bPrime, cPrime, dPrime, ePrime, fPrime, gPrime))))))))));
268262
}
269263

@@ -277,14 +271,14 @@ public static <A, APrime, B, BPrime, C, CPrime, D, DPrime, E, EPrime, F, FPrime,
277271
Matcher<? super G, ? extends GPrime> gMatcher,
278272
Matcher<? super H, ? extends HPrime> hMatcher,
279273
Fn8<? super APrime, ? super BPrime, ? super CPrime, ? super DPrime, ? super EPrime, ? super FPrime, ? super GPrime, ? super HPrime, ? extends R> body) {
280-
return new Partial<>(into8((a, b, c, d, e, f, g, h) -> aMatcher.apply(a)
281-
.flatMap(aPrime -> bMatcher.apply(b)
282-
.flatMap(bPrime -> cMatcher.apply(c)
283-
.flatMap(cPrime -> dMatcher.apply(d)
284-
.flatMap(dPrime -> eMatcher.apply(e)
285-
.flatMap(ePrime -> fMatcher.apply(f)
286-
.flatMap(fPrime -> gMatcher.apply(g)
287-
.flatMap(gPrime -> hMatcher.apply(h)
274+
return new Partial<>(into8((a, b, c, d, e, f, g, h) -> aMatcher.match(a)
275+
.flatMap(aPrime -> bMatcher.match(b)
276+
.flatMap(bPrime -> cMatcher.match(c)
277+
.flatMap(cPrime -> dMatcher.match(d)
278+
.flatMap(dPrime -> eMatcher.match(e)
279+
.flatMap(ePrime -> fMatcher.match(f)
280+
.flatMap(fPrime -> gMatcher.match(g)
281+
.flatMap(gPrime -> hMatcher.match(h)
288282
.fmap(hPrime -> body.apply(aPrime, bPrime, cPrime, dPrime, ePrime, fPrime, gPrime, hPrime)))))))))));
289283
}
290284

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,44 @@
11
package com.jnape.palatable.lambda.structural;
22

33
import com.jnape.palatable.lambda.adt.Maybe;
4-
import com.jnape.palatable.lambda.functions.Fn1;
54

65
import java.util.function.Function;
76

87
import static com.jnape.palatable.lambda.adt.Maybe.just;
98
import static com.jnape.palatable.lambda.functions.builtin.fn2.Eq.eq;
109

1110
@FunctionalInterface
12-
public interface Matcher<A, B> extends Fn1<A, Maybe<B>> {
11+
public interface Matcher<A, B> {
12+
13+
Maybe<B> match(A a);
1314

1415
static <A> Matcher<A, A> $(Function<? super A, Boolean> predicate) {
1516
return a -> just(a).filter(predicate);
1617
}
1718

19+
@SuppressWarnings("unchecked")
20+
static <A> Any<A> $() {
21+
return Any.INSTANCE;
22+
}
23+
1824
static <A> Matcher<A, A> $(A a) {
1925
return $(eq(a));
2026
}
2127

2228
static <A> Matcher<A, A> identity() {
2329
return Maybe::just;
2430
}
31+
32+
public static final class Any<A> implements Matcher<A, A> {
33+
34+
private static final Any INSTANCE = new Any();
35+
36+
private Any() {
37+
}
38+
39+
@Override
40+
public Maybe<A> match(A a) {
41+
return just(a);
42+
}
43+
}
2544
}

0 commit comments

Comments
 (0)