Skip to content

Commit 629000a

Browse files
committed
IterableLens#mapping, an Iso for mapping Iterables
1 parent 1a99c5e commit 629000a

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/).
55

66
## [Unreleased]
7+
### Added
8+
- `IterableLens#mapping`, an `Iso` that maps values
9+
710
### Changed
811
- `TypeSafeKey.Simple` now has a default `#apply` implementation
912

src/main/java/com/jnape/palatable/lambda/lens/lenses/IterableLens.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
import com.jnape.palatable.lambda.adt.Maybe;
44
import com.jnape.palatable.lambda.functions.builtin.fn1.Head;
55
import com.jnape.palatable.lambda.functions.builtin.fn1.Tail;
6+
import com.jnape.palatable.lambda.lens.Iso;
67
import com.jnape.palatable.lambda.lens.Lens;
78

89
import static com.jnape.palatable.lambda.functions.Fn2.fn2;
910
import static com.jnape.palatable.lambda.functions.builtin.fn1.Id.id;
1011
import static com.jnape.palatable.lambda.functions.builtin.fn2.Cons.cons;
12+
import static com.jnape.palatable.lambda.functions.builtin.fn2.Map.map;
13+
import static com.jnape.palatable.lambda.lens.Iso.simpleIso;
1114
import static com.jnape.palatable.lambda.lens.Lens.simpleLens;
15+
import static com.jnape.palatable.lambda.lens.functions.View.view;
1216

1317
/**
1418
* Lenses that operate on {@link Iterable}s.
@@ -43,4 +47,16 @@ public static <A> Lens.Simple<Iterable<A>, Maybe<A>> head() {
4347
public static <A> Lens.Simple<Iterable<A>, Iterable<A>> tail() {
4448
return simpleLens(Tail::tail, fn2(Head.<A>head().andThen(o -> o.fmap(cons()).orElse(id()))).toBiFunction());
4549
}
50+
51+
/**
52+
* An iso focusing on the mapped values of an {@link Iterable}.
53+
*
54+
* @param abIso the iso from A to B
55+
* @param <A> the unmapped {@link Iterable} element type
56+
* @param <B> the mapped {@link Iterable} element type
57+
* @return an iso that maps {@link Iterable}&lt;A&gt; to {@link Iterable}&lt;B&gt;
58+
*/
59+
public static <A, B> Iso.Simple<Iterable<A>, Iterable<B>> mapping(Iso<A, A, B, B> abIso) {
60+
return simpleIso(map(view(abIso)), map(view(abIso.mirror())));
61+
}
4662
}

src/test/java/com/jnape/palatable/lambda/lens/lenses/IterableLensTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.jnape.palatable.lambda.lens.lenses;
22

33
import com.jnape.palatable.lambda.adt.Maybe;
4+
import com.jnape.palatable.lambda.lens.Iso;
45
import com.jnape.palatable.lambda.lens.Lens;
56
import org.junit.Test;
67

78
import static com.jnape.palatable.lambda.adt.Maybe.just;
89
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
910
import static com.jnape.palatable.lambda.functions.builtin.fn2.Map.map;
11+
import static com.jnape.palatable.lambda.lens.Iso.simpleIso;
1012
import static com.jnape.palatable.lambda.lens.functions.Over.over;
1113
import static com.jnape.palatable.lambda.lens.functions.Set.set;
1214
import static com.jnape.palatable.lambda.lens.functions.View.view;
@@ -51,4 +53,19 @@ public void tail() {
5153
assertThat(over(tail, map(x -> x + 1), emptyList()), isEmpty());
5254
assertThat(over(tail, map(x -> x + 1), asList(1, 2, 3)), iterates(1, 3, 4));
5355
}
56+
57+
@Test
58+
public void mapping() {
59+
Iso.Simple<Iterable<String>, Iterable<Integer>> iso = IterableLens.mapping(simpleIso(Integer::parseInt, Object::toString));
60+
61+
assertThat(view(iso, emptyList()), isEmpty());
62+
assertThat(view(iso, singletonList("1")), iterates(1));
63+
assertThat(view(iso, asList("1", "2", "3")), iterates(1, 2, 3));
64+
65+
assertThat(set(iso, emptyList(), emptyList()), isEmpty());
66+
assertThat(set(iso, singletonList(1), emptyList()), iterates("1"));
67+
assertThat(set(iso, singletonList(2), singletonList("1")), iterates("2"));
68+
assertThat(set(iso, asList(1, 2, 3), singletonList("1")), iterates("1", "2", "3"));
69+
assertThat(set(iso, emptyList(), singletonList("1")), isEmpty());
70+
}
5471
}

0 commit comments

Comments
 (0)