Skip to content

Commit 60a7eff

Browse files
committed
peek now accepts a -> IO <?> for better inference
1 parent 51590cd commit 60a7eff

File tree

13 files changed

+54
-50
lines changed

13 files changed

+54
-50
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.jnape.palatable.lambda.functor.Applicative;
1313
import com.jnape.palatable.lambda.functor.Bifunctor;
1414
import com.jnape.palatable.lambda.functor.builtin.Lazy;
15+
import com.jnape.palatable.lambda.io.IO;
1516
import com.jnape.palatable.lambda.monad.Monad;
1617
import com.jnape.palatable.lambda.traversable.Traversable;
1718

@@ -176,7 +177,7 @@ public Either<L, R> peek(Effect<R> effect) {
176177
* @param rightEffect the effecting consumer for right values
177178
* @return the Either, unaltered
178179
*/
179-
public Either<L, R> peek(Effect<L> leftEffect, Effect<R> rightEffect) {
180+
public Either<L, R> peek(Fn1<? super L, ? extends IO<?>> leftEffect, Fn1<? super R, ? extends IO<?>> rightEffect) {
180181
return Peek2.peek2(leftEffect, rightEffect, this);
181182
}
182183

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
import com.jnape.palatable.lambda.adt.coproduct.CoProduct2;
66
import com.jnape.palatable.lambda.adt.hlist.HList;
77
import com.jnape.palatable.lambda.adt.hlist.Tuple2;
8-
import com.jnape.palatable.lambda.functions.Effect;
98
import com.jnape.palatable.lambda.functions.Fn0;
109
import com.jnape.palatable.lambda.functions.Fn1;
1110
import com.jnape.palatable.lambda.functions.builtin.fn2.Peek;
1211
import com.jnape.palatable.lambda.functor.Applicative;
1312
import com.jnape.palatable.lambda.functor.Functor;
1413
import com.jnape.palatable.lambda.functor.builtin.Lazy;
14+
import com.jnape.palatable.lambda.io.IO;
1515
import com.jnape.palatable.lambda.monad.Monad;
1616
import com.jnape.palatable.lambda.traversable.Traversable;
1717

@@ -206,7 +206,7 @@ public Choice2<A, Unit> invert() {
206206
* @param effect the consumer
207207
* @return the same Maybe instance
208208
*/
209-
public final Maybe<A> peek(Effect<A> effect) {
209+
public final Maybe<A> peek(Fn1<? super A, ? extends IO<?>> effect) {
210210
return Peek.peek(effect, this);
211211
}
212212

src/main/java/com/jnape/palatable/lambda/functions/builtin/fn2/Peek.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.jnape.palatable.lambda.functions.Fn1;
55
import com.jnape.palatable.lambda.functions.Fn2;
66
import com.jnape.palatable.lambda.functor.Functor;
7+
import com.jnape.palatable.lambda.io.IO;
78

89
/**
910
* Given an {@link Effect}, "peek" at the value contained inside a {@link Functor} via {@link Functor#fmap(Fn1)},
@@ -12,31 +13,31 @@
1213
* @param <A> the functor parameter type
1314
* @param <FA> the functor type
1415
*/
15-
public final class Peek<A, FA extends Functor<A, ?>> implements Fn2<Effect<? super A>, FA, FA> {
16+
public final class Peek<A, FA extends Functor<A, ?>> implements Fn2<Fn1<? super A, ? extends IO<?>>, FA, FA> {
1617
private static final Peek<?, ?> INSTANCE = new Peek<>();
1718

1819
private Peek() {
1920
}
2021

2122
@Override
2223
@SuppressWarnings("unchecked")
23-
public FA checkedApply(Effect<? super A> consumer, FA fa) {
24+
public FA checkedApply(Fn1<? super A, ? extends IO<?>> effect, FA fa) {
2425
return (FA) fa.fmap(a -> {
25-
consumer.apply(a).unsafePerformIO();
26+
effect.apply(a).unsafePerformIO();
2627
return a;
27-
});
28+
}).coerce();
2829
}
2930

3031
@SuppressWarnings("unchecked")
3132
public static <A, FA extends Functor<A, ?>> Peek<A, FA> peek() {
3233
return (Peek<A, FA>) INSTANCE;
3334
}
3435

35-
public static <A, FA extends Functor<A, ?>> Fn1<FA, FA> peek(Effect<? super A> consumer) {
36-
return Peek.<A, FA>peek().apply(consumer);
36+
public static <A, FA extends Functor<A, ?>> Fn1<FA, FA> peek(Fn1<? super A, ? extends IO<?>> effect) {
37+
return Peek.<A, FA>peek().apply(effect);
3738
}
3839

39-
public static <A, FA extends Functor<A, ?>> FA peek(Effect<? super A> consumer, FA fa) {
40-
return Peek.<A, FA>peek(consumer).apply(fa);
40+
public static <A, FA extends Functor<A, ?>> FA peek(Fn1<? super A, ? extends IO<?>> effect, FA fa) {
41+
return Peek.<A, FA>peek(effect).apply(fa);
4142
}
4243
}

src/main/java/com/jnape/palatable/lambda/functions/builtin/fn2/Peek2.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.jnape.palatable.lambda.functions.Fn3;
77
import com.jnape.palatable.lambda.functor.Bifunctor;
88
import com.jnape.palatable.lambda.functor.BoundedBifunctor;
9+
import com.jnape.palatable.lambda.io.IO;
910

1011
/**
1112
* Given two {@link Effect}s, "peek" at the values contained inside a {@link Bifunctor} via
@@ -16,20 +17,20 @@
1617
* @param <FAB> the bifunctor type
1718
*/
1819
public final class Peek2<A, B, FAB extends BoundedBifunctor<A, B, ? super A, ? super B, ?>> implements
19-
Fn3<Effect<? super A>, Effect<? super B>, FAB, FAB> {
20+
Fn3<Fn1<? super A, ? extends IO<?>>, Fn1<? super B, ? extends IO<?>>, FAB, FAB> {
2021
private static final Peek2<?, ?, ?> INSTANCE = new Peek2<>();
2122

2223
private Peek2() {
2324
}
2425

2526
@Override
2627
@SuppressWarnings("unchecked")
27-
public FAB checkedApply(Effect<? super A> aConsumer, Effect<? super B> bConsumer, FAB fab) {
28+
public FAB checkedApply(Fn1<? super A, ? extends IO<?>> effectA, Fn1<? super B, ? extends IO<?>> effectB, FAB fab) {
2829
return (FAB) fab.biMap(a -> {
29-
aConsumer.apply(a).unsafePerformIO();
30+
effectA.apply(a).unsafePerformIO();
3031
return a;
3132
}, b -> {
32-
bConsumer.apply(b).unsafePerformIO();
33+
effectB.apply(b).unsafePerformIO();
3334
return b;
3435
});
3536
}
@@ -39,21 +40,21 @@ public FAB checkedApply(Effect<? super A> aConsumer, Effect<? super B> bConsumer
3940
return (Peek2<A, B, FAB>) INSTANCE;
4041
}
4142

42-
public static <A, B, FAB extends BoundedBifunctor<A, B, ? super A, ? super B, ?>> Fn2<Effect<? super B>, FAB, FAB>
43-
peek2(Effect<? super A> aConsumer) {
44-
return Peek2.<A, B, FAB>peek2().apply(aConsumer);
43+
public static <A, B, FAB extends BoundedBifunctor<A, B, ? super A, ? super B, ?>>
44+
Fn2<Fn1<? super B, ? extends IO<?>>, FAB, FAB> peek2(Fn1<? super A, ? extends IO<?>> effectA) {
45+
return Peek2.<A, B, FAB>peek2().apply(effectA);
4546
}
4647

4748
public static <A, B, FAB extends BoundedBifunctor<A, B, ? super A, ? super B, ?>> Fn1<FAB, FAB> peek2(
48-
Effect<? super A> aConsumer,
49-
Effect<? super B> bConsumer) {
50-
return Peek2.<A, B, FAB>peek2(aConsumer).apply(bConsumer);
49+
Fn1<? super A, ? extends IO<?>> effectA,
50+
Fn1<? super B, ? extends IO<?>> effectB) {
51+
return Peek2.<A, B, FAB>peek2(effectA).apply(effectB);
5152
}
5253

5354
public static <A, B, FAB extends BoundedBifunctor<A, B, ? super A, ? super B, ?>> FAB peek2(
54-
Effect<? super A> aConsumer,
55-
Effect<? super B> bConsumer,
55+
Fn1<? super A, ? extends IO<?>> effectA,
56+
Fn1<? super B, ? extends IO<?>> effectB,
5657
FAB fab) {
57-
return Peek2.<A, B, FAB>peek2(aConsumer, bConsumer).apply(fab);
58+
return Peek2.<A, B, FAB>peek2(effectA, effectB).apply(fab);
5859
}
5960
}

src/test/java/com/jnape/palatable/lambda/adt/MaybeTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
2222
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
2323
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
24-
import static com.jnape.palatable.lambda.functions.Effect.fromConsumer;
24+
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
2525
import static com.jnape.palatable.lambda.functions.builtin.fn2.Eq.eq;
2626
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
27+
import static com.jnape.palatable.lambda.io.IO.io;
2728
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
2829
import static org.junit.Assert.assertEquals;
2930
import static org.junit.Assert.assertSame;
@@ -98,10 +99,10 @@ public void fromEither() {
9899
@Test
99100
public void peek() {
100101
AtomicInteger ref = new AtomicInteger(0);
101-
assertEquals(just(1), just(1).peek(fromConsumer(__ -> ref.incrementAndGet())));
102+
assertEquals(just(1), just(1).peek(constantly(io(ref::incrementAndGet))));
102103
assertEquals(1, ref.get());
103104

104-
assertEquals(nothing(), nothing().peek(fromConsumer(__ -> ref.incrementAndGet())));
105+
assertEquals(nothing(), nothing().peek(constantly(io(ref::incrementAndGet))));
105106
assertEquals(1, ref.get());
106107
}
107108

src/test/java/testsupport/assertion/LensAssert.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.jnape.palatable.lambda.functions.Fn2;
77
import com.jnape.palatable.lambda.functions.builtin.fn2.Map;
88
import com.jnape.palatable.lambda.functor.Functor;
9+
import com.jnape.palatable.lambda.io.IO;
910
import com.jnape.palatable.lambda.monoid.builtin.Present;
1011
import com.jnape.palatable.lambda.optics.Optic;
1112

@@ -33,7 +34,7 @@ public static <S, A> void assertLensLawfulness(Optic<? super Fn1<?, ?>, Functor<
3334
.reduceLeft(asList(falsify("You get back what you put in", (s, b) -> view(lens, set(lens, b, s)), (s, b) -> b, cases),
3435
falsify("Putting back what you got changes nothing", (s, b) -> set(lens, view(lens, s), s), (s, b) -> s, cases),
3536
falsify("Setting twice is equivalent to setting once", (s, b) -> set(lens, b, set(lens, b, s)), (s, b) -> set(lens, b, s), cases)))
36-
.peek(failures -> {throw new AssertionError("Lens law failures\n\n" + failures);});
37+
.peek(failures -> IO.throwing(new AssertionError("Lens law failures\n\n" + failures)));
3738
}
3839

3940
private static <S, A, X> Maybe<String> falsify(String label, Fn2<S, A, X> l, Fn2<S, A, X> r,

src/test/java/testsupport/matchers/LeftMatcher.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import org.hamcrest.Matcher;
66
import org.hamcrest.TypeSafeMatcher;
77

8-
import static com.jnape.palatable.lambda.functions.Effect.fromConsumer;
98
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
9+
import static com.jnape.palatable.lambda.io.IO.io;
1010

1111
public final class LeftMatcher<L, R> extends TypeSafeMatcher<Either<L, R>> {
1212

@@ -30,11 +30,11 @@ public void describeTo(Description description) {
3030
@Override
3131
protected void describeMismatchSafely(Either<L, R> item, Description mismatchDescription) {
3232
mismatchDescription.appendText("was ");
33-
item.peek(fromConsumer(l -> {
33+
item.peek(l -> io(() -> {
3434
mismatchDescription.appendText("Left value of ");
3535
lMatcher.describeMismatch(l, mismatchDescription);
3636
}),
37-
fromConsumer(r -> mismatchDescription.appendValue(item)));
37+
r -> io(() -> mismatchDescription.appendValue(item)));
3838
}
3939

4040
public static <L, R> LeftMatcher<L, R> isLeftThat(Matcher<L> lMatcher) {

src/test/java/testsupport/matchers/RightMatcher.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import org.hamcrest.Matcher;
66
import org.hamcrest.TypeSafeMatcher;
77

8-
import static com.jnape.palatable.lambda.functions.Effect.fromConsumer;
98
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
9+
import static com.jnape.palatable.lambda.io.IO.io;
1010

1111
public final class RightMatcher<L, R> extends TypeSafeMatcher<Either<L, R>> {
1212

@@ -30,8 +30,8 @@ public void describeTo(Description description) {
3030
@Override
3131
protected void describeMismatchSafely(Either<L, R> item, Description mismatchDescription) {
3232
mismatchDescription.appendText("was ");
33-
item.peek(fromConsumer(l -> mismatchDescription.appendValue(item)),
34-
fromConsumer(r -> {
33+
item.peek(l -> io(() -> mismatchDescription.appendValue(item)),
34+
r -> io(() -> {
3535
mismatchDescription.appendText("Right value of ");
3636
rMatcher.describeMismatch(r, mismatchDescription);
3737
}));

src/test/java/testsupport/traits/ApplicativeLaws.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.jnape.palatable.lambda.adt.Maybe;
44
import com.jnape.palatable.lambda.functions.Fn1;
55
import com.jnape.palatable.lambda.functor.Applicative;
6+
import com.jnape.palatable.lambda.io.IO;
67
import com.jnape.palatable.lambda.monoid.builtin.Present;
78
import com.jnape.palatable.traitor.traits.Trait;
89

@@ -30,9 +31,8 @@ public void test(Applicative<?, App> applicative) {
3031
this::testDiscardR,
3132
this::testLazyZip)
3233
)
33-
.peek(s -> {
34-
throw new AssertionError("The following Applicative laws did not hold for instance of " + applicative.getClass() + ": \n\t - " + s);
35-
});
34+
.peek(s -> IO.throwing(new AssertionError("The following Applicative laws did not hold for instance of "
35+
+ applicative.getClass() + ": \n\t - " + s)));
3636
}
3737

3838
private Maybe<String> testIdentity(Applicative<?, App> applicative) {

src/test/java/testsupport/traits/BifunctorLaws.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.jnape.palatable.lambda.adt.Maybe;
44
import com.jnape.palatable.lambda.functions.Fn1;
55
import com.jnape.palatable.lambda.functor.Bifunctor;
6+
import com.jnape.palatable.lambda.io.IO;
67
import com.jnape.palatable.lambda.monoid.builtin.Present;
78
import com.jnape.palatable.traitor.traits.Trait;
89

@@ -22,9 +23,8 @@ public void test(Bifunctor<?, ?, BF> bifunctor) {
2223
this::testRightIdentity,
2324
this::testMutualIdentity)
2425
)
25-
.peek(s -> {
26-
throw new AssertionError("The following Bifunctor laws did not hold for instance of " + bifunctor.getClass() + ": \n\t - " + s);
27-
});
26+
.peek(s -> IO.throwing(new AssertionError("The following Bifunctor laws did not hold for instance of " +
27+
bifunctor.getClass() + ": \n\t - " + s)));
2828
}
2929

3030
private Maybe<String> testLeftIdentity(Bifunctor<?, ?, BF> bifunctor) {

0 commit comments

Comments
 (0)