Skip to content

Commit f0009b8

Browse files
committed
Adding HMapLens, lenses for HMaps
1 parent d2e0c1d commit f0009b8

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.jnape.palatable.lambda.lens.lenses;
2+
3+
import com.jnape.palatable.lambda.adt.Maybe;
4+
import com.jnape.palatable.lambda.adt.hmap.HMap;
5+
import com.jnape.palatable.lambda.adt.hmap.TypeSafeKey;
6+
import com.jnape.palatable.lambda.lens.Lens;
7+
8+
import static com.jnape.palatable.lambda.lens.Lens.simpleLens;
9+
10+
/**
11+
* Lenses that operate on {@link HMap}s.
12+
*/
13+
public final class HMapLens {
14+
private HMapLens() {
15+
}
16+
17+
/**
18+
* A lens that focuses on a value at a {@link TypeSafeKey}<A> in an {@link HMap}, as a {@link Maybe}.
19+
*
20+
* @param key the key
21+
* @param <A> the value type at the key
22+
* @return the lens
23+
*/
24+
public static <A> Lens.Simple<HMap, Maybe<A>> valueAt(TypeSafeKey<A> key) {
25+
return simpleLens(m -> m.get(key), (m, maybeA) -> maybeA.fmap(a -> m.put(key, a)).orElseGet(() -> m.remove(key)));
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.jnape.palatable.lambda.lens.lenses;
2+
3+
import com.jnape.palatable.lambda.adt.hmap.TypeSafeKey;
4+
import org.junit.Test;
5+
6+
import static com.jnape.palatable.lambda.adt.Maybe.just;
7+
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
8+
import static com.jnape.palatable.lambda.adt.hmap.HMap.emptyHMap;
9+
import static com.jnape.palatable.lambda.adt.hmap.HMap.hMap;
10+
import static com.jnape.palatable.lambda.adt.hmap.HMap.singletonHMap;
11+
import static com.jnape.palatable.lambda.adt.hmap.TypeSafeKey.typeSafeKey;
12+
import static java.util.Arrays.asList;
13+
import static testsupport.assertion.LensAssert.assertLensLawfulness;
14+
15+
public class HMapLensTest {
16+
17+
@Test
18+
public void valueAt() {
19+
TypeSafeKey<String> key = typeSafeKey();
20+
assertLensLawfulness(HMapLens.valueAt(key),
21+
asList(emptyHMap(),
22+
singletonHMap(key, "foo"),
23+
hMap(key, "foo",
24+
typeSafeKey(), "bar"),
25+
singletonHMap(typeSafeKey(), "bar")),
26+
asList(nothing(),
27+
just("foo"),
28+
just("bar")));
29+
}
30+
}

0 commit comments

Comments
 (0)