key2, V2 value2,
+ TypeSafeKey key3, V3 value3) {
+ return hMap(key1, value1, key2, value2).put(key3, value3);
+ }
+}
diff --git a/src/main/java/com/jnape/palatable/lambda/adt/hmap/TypeSafeKey.java b/src/main/java/com/jnape/palatable/lambda/adt/hmap/TypeSafeKey.java
new file mode 100644
index 000000000..f4d27566b
--- /dev/null
+++ b/src/main/java/com/jnape/palatable/lambda/adt/hmap/TypeSafeKey.java
@@ -0,0 +1,20 @@
+package com.jnape.palatable.lambda.adt.hmap;
+
+/**
+ * An interface representing a parametrized key for use in HMaps. The parameter specifies the type of the value stored
+ * at this binding inside the HMap.
+ *
+ * This is intentionally an interface so user-defined implementations are possible; however, it's important to note that
+ * all hopes of type-safety hinge on equality being implemented such that no two TypeSafeKeys with differing parameters
+ * may be considered equal. Reference equality is used here as the default, as that is sufficient.
+ *
+ * @param The type of the value that this key maps to inside an HMap
+ */
+@SuppressWarnings("unused")
+public interface TypeSafeKey {
+
+ static TypeSafeKey typeSafeKey() {
+ return new TypeSafeKey() {
+ };
+ }
+}
diff --git a/src/main/java/com/jnape/palatable/lambda/adt/tuples/Tuple2.java b/src/main/java/com/jnape/palatable/lambda/adt/tuples/Tuple2.java
deleted file mode 100644
index e60638a5f..000000000
--- a/src/main/java/com/jnape/palatable/lambda/adt/tuples/Tuple2.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.jnape.palatable.lambda.adt.tuples;
-
-import com.jnape.palatable.lambda.functions.MonadicFunction;
-import com.jnape.palatable.lambda.functor.Bifunctor;
-import com.jnape.palatable.lambda.functor.Functor;
-
-import java.util.Objects;
-
-import static java.lang.String.format;
-
-/**
- * The binary tuple product type. Tuple2
- *
- * @param <_1> The first slot element type
- * @param <_2> The second slot element type
- * @see Tuple3
- */
-public class Tuple2<_1, _2> implements Functor<_2>, Bifunctor<_1, _2> {
-
- public final _1 _1;
- public final _2 _2;
-
- Tuple2(_1 _1, _2 _2) {
- this._1 = _1;
- this._2 = _2;
- }
-
- @Override
- public <_2A> Tuple2<_1, _2A> fmap(MonadicFunction super _2, ? extends _2A> fn) {
- return biMapR(fn);
- }
-
- @Override
- public <_1A, _2A> Tuple2<_1A, _2A> biMap(MonadicFunction super _1, ? extends _1A> f1,
- MonadicFunction super _2, ? extends _2A> f2) {
- return tuple(f1.apply(_1), f2.apply(_2));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <_1A> Tuple2<_1A, _2> biMapL(MonadicFunction super _1, ? extends _1A> fn) {
- return (Tuple2<_1A, _2>) Bifunctor.super.biMapL(fn);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <_2A> Tuple2<_1, _2A> biMapR(MonadicFunction super _2, ? extends _2A> fn) {
- return (Tuple2<_1, _2A>) Bifunctor.super.biMapR(fn);
- }
-
- @Override
- public String toString() {
- return format("(%s, %s)", _1, _2);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Tuple2, ?> tuple2 = (Tuple2, ?>) o;
- return Objects.equals(_1, tuple2._1) &&
- Objects.equals(_2, tuple2._2);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(_1, _2);
- }
-
- public static <_1, _2> Tuple2<_1, _2> tuple(_1 _1, _2 _2) {
- return new Tuple2<>(_1, _2);
- }
-}
diff --git a/src/main/java/com/jnape/palatable/lambda/adt/tuples/Tuple3.java b/src/main/java/com/jnape/palatable/lambda/adt/tuples/Tuple3.java
deleted file mode 100644
index a8b947414..000000000
--- a/src/main/java/com/jnape/palatable/lambda/adt/tuples/Tuple3.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.jnape.palatable.lambda.adt.tuples;
-
-import com.jnape.palatable.lambda.functions.MonadicFunction;
-
-import java.util.Objects;
-
-import static java.lang.String.format;
-
-/**
- * The ternary tuple product type. This class extends {@link Tuple2} and as such embodies the same
- * functorial properties.
- *
- * @param <_1> The first slot element type
- * @param <_2> The second slot element type
- * @param <_3> The third slot element type
- */
-public class Tuple3<_1, _2, _3> extends Tuple2<_1, _2> {
-
- public final _3 _3;
-
- Tuple3(_1 _1, _2 _2, _3 _3) {
- super(_1, _2);
- this._3 = _3;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <_2A> Tuple3<_1, _2A, _3> fmap(MonadicFunction super _2, ? extends _2A> fn) {
- return (Tuple3<_1, _2A, _3>) super.fmap(fn);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <_1A, _2A> Tuple3<_1A, _2A, _3> biMap(MonadicFunction super _1, ? extends _1A> f1,
- MonadicFunction super _2, ? extends _2A> f2) {
- return (Tuple3<_1A, _2A, _3>) super.biMap(f1, f2);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <_1A> Tuple3<_1A, _2, _3> biMapL(MonadicFunction super _1, ? extends _1A> fn) {
- return (Tuple3<_1A, _2, _3>) super.biMapL(fn);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <_2A> Tuple3<_1, _2A, _3> biMapR(MonadicFunction super _2, ? extends _2A> fn) {
- return (Tuple3<_1, _2A, _3>) super.biMapR(fn);
- }
-
- @Override
- public boolean equals(Object other) {
- if (other instanceof Tuple3) {
- Tuple3 that = (Tuple3) other;
- return super.equals(other)
- && Objects.equals(this._3, that._3);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), _3);
- }
-
- @Override
- public String toString() {
- return format("(%s, %s, %s)", _1, _2, _3);
- }
-
- public static <_1, _2, _3> Tuple3<_1, _2, _3> tuple(_1 _1, _2 _2, _3 _3) {
- return new Tuple3<>(_1, _2, _3);
- }
-}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/DyadicFunction.java b/src/main/java/com/jnape/palatable/lambda/functions/DyadicFunction.java
index 3aed1de61..b599cf797 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/DyadicFunction.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/DyadicFunction.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functor.Profunctor;
/**
@@ -45,6 +45,6 @@ default DyadicFunction flip() {
}
default MonadicFunction, C> uncurry() {
- return (ab) -> apply(ab._1, ab._2);
+ return (ab) -> apply(ab._1(), ab._2());
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/TriadicFunction.java b/src/main/java/com/jnape/palatable/lambda/functions/TriadicFunction.java
index db3cb325d..72423cead 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/TriadicFunction.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/TriadicFunction.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
/**
* A function taking three arguments. Auto-curried
@@ -34,6 +34,6 @@ default TriadicFunction flip() {
@Override
default DyadicFunction, C, D> uncurry() {
- return (ab, c) -> apply(ab._1, ab._2, c);
+ return (ab, c) -> apply(ab._1(), ab._2(), c);
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProduct.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProduct.java
index 159e1f8b6..29d2846a6 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProduct.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProduct.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.CombinatorialIterator;
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Iterate.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Iterate.java
index 22e2a169a..3e4330f5f 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Iterate.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Iterate.java
@@ -6,7 +6,7 @@
import java.util.Optional;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
/**
* Lazily generate an infinite Iterable from the successive applications of the function first to the
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2.java
index 6a512a16e..21a015ee8 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2.java
@@ -1,17 +1,17 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
/**
* Creates a Tuple2 from two values.
*
* @param The type of the first value; also the first slot type of returned Tuple2
* @param The type of the second value; also the second slot type of returned Tuple2
- * @see Tuple2
+ * @see com.jnape.palatable.lambda.adt.hlist.Tuple2
*/
public final class Tupler2 implements DyadicFunction > {
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Unfoldr.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Unfoldr.java
index 3a87da9ea..0a1e311a8 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Unfoldr.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Unfoldr.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.UnfoldingIterator;
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Zip.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Zip.java
index a82c89d2f..e985fd7f9 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Zip.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Zip.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
diff --git a/src/main/java/com/jnape/palatable/lambda/functor/Bifunctor.java b/src/main/java/com/jnape/palatable/lambda/functor/Bifunctor.java
index 3ba5547da..903aa463f 100644
--- a/src/main/java/com/jnape/palatable/lambda/functor/Bifunctor.java
+++ b/src/main/java/com/jnape/palatable/lambda/functor/Bifunctor.java
@@ -13,7 +13,7 @@
* @param The type of the second parameter
* @see Functor
* @see Profunctor
- * @see com.jnape.palatable.lambda.adt.tuples.Tuple2
+ * @see com.jnape.palatable.lambda.adt.hlist.Tuple2
*/
@FunctionalInterface
public interface Bifunctor {
@@ -26,6 +26,6 @@ default Bifunctor biMapR(MonadicFunction super B, ? extends C> fn) {
return biMap(id(), fn);
}
- Bifunctor biMap(MonadicFunction super A, ? extends C> f1,
- MonadicFunction super B, ? extends D> f2);
+ Bifunctor biMap(MonadicFunction super A, ? extends C> lFn,
+ MonadicFunction super B, ? extends D> rFn);
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functor/Functor.java b/src/main/java/com/jnape/palatable/lambda/functor/Functor.java
index 1a411061e..3f7388096 100644
--- a/src/main/java/com/jnape/palatable/lambda/functor/Functor.java
+++ b/src/main/java/com/jnape/palatable/lambda/functor/Functor.java
@@ -13,7 +13,7 @@
* @see Bifunctor
* @see Profunctor
* @see MonadicFunction
- * @see com.jnape.palatable.lambda.adt.tuples.Tuple2
+ * @see com.jnape.palatable.lambda.adt.hlist.Tuple2
* @see com.jnape.palatable.lambda.adt.Either
*/
@FunctionalInterface
diff --git a/src/main/java/com/jnape/palatable/lambda/iterators/CombinatorialIterator.java b/src/main/java/com/jnape/palatable/lambda/iterators/CombinatorialIterator.java
index 526cbd8c9..5e4a4dcd4 100644
--- a/src/main/java/com/jnape/palatable/lambda/iterators/CombinatorialIterator.java
+++ b/src/main/java/com/jnape/palatable/lambda/iterators/CombinatorialIterator.java
@@ -1,12 +1,12 @@
package com.jnape.palatable.lambda.iterators;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
public class CombinatorialIterator extends ImmutableIterator> {
private final Iterator asIterator;
diff --git a/src/main/java/com/jnape/palatable/lambda/iterators/UnfoldingIterator.java b/src/main/java/com/jnape/palatable/lambda/iterators/UnfoldingIterator.java
index 3b34b9ed7..7a5ac3585 100644
--- a/src/main/java/com/jnape/palatable/lambda/iterators/UnfoldingIterator.java
+++ b/src/main/java/com/jnape/palatable/lambda/iterators/UnfoldingIterator.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.iterators;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import java.util.NoSuchElementException;
@@ -26,8 +26,8 @@ public A next() {
throw new NoSuchElementException();
Tuple2 acc = optionalAcc.get();
- A next = acc._1;
- optionalAcc = function.apply(acc._2);
+ A next = acc._1();
+ optionalAcc = function.apply(acc._2());
return next;
}
}
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/EitherTest.java b/src/test/java/com/jnape/palatable/lambda/adt/EitherTest.java
index 2950ed5b0..964e5ddfa 100644
--- a/src/test/java/com/jnape/palatable/lambda/adt/EitherTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/adt/EitherTest.java
@@ -6,6 +6,8 @@
import org.junit.rules.ExpectedException;
import java.util.Optional;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
import static com.jnape.palatable.lambda.adt.Either.fromOptional;
import static com.jnape.palatable.lambda.adt.Either.left;
@@ -158,4 +160,35 @@ public void dyadicTryingLiftsCheckedSupplierMappingAnyThrownExceptions() {
throw new Exception("expected");
}, Throwable::getMessage));
}
+
+ @Test
+ public void monadicPeekLiftsIOToTheRight() {
+ Either left = left("foo");
+ Either right = right(1);
+
+ AtomicInteger intRef = new AtomicInteger();
+
+ left.peek(intRef::set);
+ assertEquals(0, intRef.get());
+
+ right.peek(intRef::set);
+ assertEquals(1, intRef.get());
+ }
+
+ @Test
+ public void dyadicPeekDuallyLiftsIO() {
+ Either left = left("foo");
+ Either right = right(1);
+
+ AtomicReference stringRef = new AtomicReference<>();
+ AtomicInteger intRef = new AtomicInteger();
+
+ left.peek(stringRef::set, intRef::set);
+ assertEquals("foo", stringRef.get());
+ assertEquals(0, intRef.get());
+
+ right.peek(stringRef::set, intRef::set);
+ assertEquals("foo", stringRef.get());
+ assertEquals(1, intRef.get());
+ }
}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/HListTest.java b/src/test/java/com/jnape/palatable/lambda/adt/HListTest.java
deleted file mode 100644
index bdac78d81..000000000
--- a/src/test/java/com/jnape/palatable/lambda/adt/HListTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.jnape.palatable.lambda.adt;
-
-import org.junit.Test;
-
-import static com.jnape.palatable.lambda.adt.HList.cons;
-import static com.jnape.palatable.lambda.adt.HList.list;
-import static com.jnape.palatable.lambda.adt.HList.nil;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
-public class HListTest {
-
- @Test
- public void head() {
- assertEquals("head", nil().cons("head").head());
- assertEquals("new head", nil().cons("old head").cons("new head").head());
- }
-
- @Test
- public void tail() {
- assertEquals(nil(), nil().cons("head").tail());
- assertEquals(nil().cons("old head"), nil().cons("old head").cons("new head").tail());
- }
-
- @Test
- public void convenienceStaticFactoryMethods() {
- assertEquals(nil().cons(1), cons(1, nil()));
- assertEquals(nil().cons(1), list(1));
- assertEquals(nil().cons('2').cons(1), list(1, '2'));
- assertEquals(nil().cons("3").cons('2').cons(1), list(1, '2', "3"));
- assertEquals(nil().cons(4.0).cons("3").cons('2').cons(1), list(1, '2', "3", 4.0));
- assertEquals(nil().cons(false).cons(4.0).cons("3").cons('2').cons(1), list(1, '2', "3", 4.0, false));
- }
-
- @Test
- public void functorialProperties() {
- assertEquals(list("1"), list(1).fmap(Object::toString));
- }
-
- @Test
- public void nilReusesInstance() {
- assertSame(nil(), nil());
- }
-}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hlist/HListTest.java b/src/test/java/com/jnape/palatable/lambda/adt/hlist/HListTest.java
new file mode 100644
index 000000000..425fb9a02
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hlist/HListTest.java
@@ -0,0 +1,65 @@
+package com.jnape.palatable.lambda.adt.hlist;
+
+import org.junit.Test;
+
+import static com.jnape.palatable.lambda.adt.hlist.HList.cons;
+import static com.jnape.palatable.lambda.adt.hlist.HList.nil;
+import static com.jnape.palatable.lambda.adt.hlist.HList.singleton;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class HListTest {
+
+ @Test
+ public void head() {
+ assertEquals("head", nil().cons("head").head());
+ assertEquals("new head", nil().cons("old head").cons("new head").head());
+ }
+
+ @Test
+ public void tail() {
+ assertEquals(nil(), nil().cons("head").tail());
+ assertEquals(nil().cons("old head"), nil().cons("old head").cons("new head").tail());
+ }
+
+ @Test
+ public void convenienceStaticFactoryMethods() {
+ assertEquals(nil().cons(1), cons(1, nil()));
+ assertEquals(nil().cons(1), singleton(1));
+ assertEquals(nil().cons('2').cons(1), tuple(1, '2'));
+ assertEquals(nil().cons("3").cons('2').cons(1), tuple(1, '2', "3"));
+ assertEquals(nil().cons(4.0).cons("3").cons('2').cons(1), tuple(1, '2', "3", 4.0));
+ assertEquals(nil().cons(false).cons(4.0).cons("3").cons('2').cons(1), tuple(1, '2', "3", 4.0, false));
+ }
+
+ @Test
+ public void nilReusesInstance() {
+ assertSame(nil(), nil());
+ }
+
+ @Test
+ @SuppressWarnings({"EqualsWithItself", "EqualsBetweenInconvertibleTypes"})
+ public void equality() {
+ assertTrue(nil().equals(nil()));
+ assertTrue(cons(1, nil()).equals(cons(1, nil())));
+
+ assertFalse(cons(1, nil()).equals(nil()));
+ assertFalse(nil().equals(cons(1, nil())));
+
+ assertFalse(cons(1, cons(2, nil())).equals(cons(1, nil())));
+ assertFalse(cons(1, nil()).equals(cons(1, cons(2, nil()))));
+ }
+
+ @Test
+ public void hashCodeUsesDecentDistribution() {
+ assertEquals(nil().hashCode(), nil().hashCode());
+ assertEquals(nil().cons(1).hashCode(), nil().cons(1).hashCode());
+
+ assertNotEquals(nil().cons(1).hashCode(), nil().cons(2).hashCode());
+ assertNotEquals(nil().cons(1).cons(2).hashCode(), nil().cons(1).cons(3).hashCode());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hlist/SingletonTest.java b/src/test/java/com/jnape/palatable/lambda/adt/hlist/SingletonTest.java
new file mode 100644
index 000000000..3b062d372
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hlist/SingletonTest.java
@@ -0,0 +1,37 @@
+package com.jnape.palatable.lambda.adt.hlist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static com.jnape.palatable.lambda.adt.hlist.HList.nil;
+import static org.junit.Assert.assertEquals;
+
+public class SingletonTest {
+
+ private Singleton singleton;
+
+ @Before
+ public void setUp() {
+ singleton = new Singleton<>(1);
+ }
+
+ @Test
+ public void head() {
+ assertEquals((Integer) 1, singleton.head());
+ }
+
+ @Test
+ public void tail() {
+ assertEquals(nil(), singleton.tail());
+ }
+
+ @Test
+ public void cons() {
+ assertEquals(new Tuple2<>("0", singleton), singleton.cons("0"));
+ }
+
+ @Test
+ public void functorProperties() {
+ assertEquals(new Singleton<>("1"), singleton.fmap(Object::toString));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple2Test.java b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple2Test.java
new file mode 100644
index 000000000..d74518bba
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple2Test.java
@@ -0,0 +1,71 @@
+package com.jnape.palatable.lambda.adt.hlist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
+import static org.junit.Assert.assertEquals;
+
+public class Tuple2Test {
+
+ private Tuple2 tuple2;
+
+ @Before
+ public void setUp() throws Exception {
+ tuple2 = new Tuple2<>(1, new Singleton<>(2));
+ }
+
+ @Test
+ public void head() {
+ assertEquals((Integer) 1, tuple2.head());
+ }
+
+ @Test
+ public void tail() {
+ assertEquals(new Singleton<>(2), tuple2.tail());
+ }
+
+ @Test
+ public void cons() {
+ assertEquals(new Tuple3<>(0, tuple2), tuple2.cons(0));
+ }
+
+ @Test
+ public void accessors() {
+ assertEquals((Integer) 1, tuple2._1());
+ assertEquals((Integer) 2, tuple2._2());
+ }
+
+ @Test
+ public void functorProperties() {
+ assertEquals(new Tuple2<>(1, new Singleton<>("2")), tuple2.fmap(Object::toString));
+ }
+
+ @Test
+ public void bifunctorProperties() {
+ assertEquals(new Tuple2<>("1", new Singleton<>("2")), tuple2.biMap(Object::toString, Object::toString));
+ }
+
+ @Test
+ public void mapEntryProperties() {
+ assertEquals((Integer) 1, tuple2.getKey());
+ assertEquals((Integer) 2, tuple2.getValue());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void setValueIsNotSupported() {
+ tuple2.setValue(3);
+ }
+
+ @Test
+ public void staticFactoryMethodFromMapEntry() {
+ Map.Entry stringIntEntry = new HashMap() {{
+ put("string", 1);
+ }}.entrySet().iterator().next();
+
+ assertEquals(tuple("string", 1), Tuple2.fromEntry(stringIntEntry));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple3Test.java b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple3Test.java
new file mode 100644
index 000000000..9aa335811
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple3Test.java
@@ -0,0 +1,48 @@
+package com.jnape.palatable.lambda.adt.hlist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Tuple3Test {
+
+ private Tuple3 tuple3;
+
+ @Before
+ public void setUp() {
+ tuple3 = new Tuple3<>(1, new Tuple2<>("2", new Singleton<>('3')));
+ }
+
+ @Test
+ public void head() {
+ assertEquals((Integer) 1, tuple3.head());
+ }
+
+ @Test
+ public void tail() {
+ assertEquals(new Tuple2<>("2", new Singleton<>('3')), tuple3.tail());
+ }
+
+ @Test
+ public void cons() {
+ assertEquals(new Tuple4<>(0, tuple3), tuple3.cons(0));
+ }
+
+ @Test
+ public void accessors() {
+ assertEquals((Integer) 1, tuple3._1());
+ assertEquals("2", tuple3._2());
+ assertEquals((Character) '3', tuple3._3());
+ }
+
+ @Test
+ public void functorProperties() {
+ assertEquals(new Tuple3<>(1, new Tuple2<>("2", new Singleton<>("3"))), tuple3.fmap(Object::toString));
+ }
+
+ @Test
+ public void bifunctorProperties() {
+ assertEquals(new Tuple3<>(1, new Tuple2<>(2, new Singleton<>("3"))), tuple3.biMap(Integer::parseInt, Object::toString));
+ }
+}
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple4Test.java b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple4Test.java
new file mode 100644
index 000000000..1213ec5a5
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple4Test.java
@@ -0,0 +1,50 @@
+package com.jnape.palatable.lambda.adt.hlist;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Tuple4Test {
+
+ private Tuple4 tuple4;
+
+ @Before
+ public void setUp() {
+ tuple4 = new Tuple4<>(1, new Tuple3<>("2", new Tuple2<>('3', new Singleton<>(false))));
+ }
+
+ @Test
+ public void head() {
+ assertEquals((Integer) 1, tuple4.head());
+ }
+
+ @Test
+ public void tail() {
+ assertEquals(new Tuple3<>("2", new Tuple2<>('3', new Singleton<>(false))), tuple4.tail());
+ }
+
+ @Test
+ public void cons() {
+ assertEquals(new Tuple5<>(0, tuple4), tuple4.cons(0));
+ }
+
+ @Test
+ public void accessors() {
+ assertEquals((Integer) 1, tuple4._1());
+ assertEquals("2", tuple4._2());
+ assertEquals((Character) '3', tuple4._3());
+ assertEquals(false, tuple4._4());
+ }
+
+ @Test
+ public void functorProperties() {
+ assertEquals(new Tuple4<>(1, new Tuple3<>("2", new Tuple2<>('3', new Singleton<>(true)))), tuple4.fmap(x -> !x));
+ }
+
+ @Test
+ public void bifunctorProperties() {
+ assertEquals(new Tuple4<>(1, new Tuple3<>("2", new Tuple2<>("3", new Singleton<>(true)))),
+ tuple4.biMap(Object::toString, x -> !x));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple5Test.java b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple5Test.java
new file mode 100644
index 000000000..2745f3c47
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple5Test.java
@@ -0,0 +1,53 @@
+package com.jnape.palatable.lambda.adt.hlist;
+
+import com.jnape.palatable.lambda.adt.hlist.HList.HCons;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Tuple5Test {
+
+ private Tuple5 tuple5;
+
+ @Before
+ public void setUp() {
+ tuple5 = new Tuple5<>(1, new Tuple4<>("2", new Tuple3<>('3', new Tuple2<>(false, new Singleton<>(5L)))));
+ }
+
+ @Test
+ public void head() {
+ assertEquals((Integer) 1, tuple5.head());
+ }
+
+ @Test
+ public void tail() {
+ assertEquals(new Tuple4<>("2", new Tuple3<>('3', new Tuple2<>(false, new Singleton<>(5L)))), tuple5.tail());
+ }
+
+ @Test
+ public void cons() {
+ assertEquals(new HCons<>(0, tuple5), tuple5.cons(0));
+ }
+
+ @Test
+ public void accessors() {
+ assertEquals((Integer) 1, tuple5._1());
+ assertEquals("2", tuple5._2());
+ assertEquals((Character) '3', tuple5._3());
+ assertEquals(false, tuple5._4());
+ assertEquals((Long) 5L, tuple5._5());
+ }
+
+ @Test
+ public void functorProperties() {
+ assertEquals(new Tuple5<>(1, new Tuple4<>("2", new Tuple3<>('3', new Tuple2<>(false, new Singleton<>("5"))))),
+ tuple5.fmap(Object::toString));
+ }
+
+ @Test
+ public void bifunctorProperties() {
+ assertEquals(new Tuple5<>(1, new Tuple4<>("2", new Tuple3<>('3', new Tuple2<>(true, new Singleton<>("5"))))),
+ tuple5.biMap(x -> !x, Object::toString));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/hmap/HMapTest.java b/src/test/java/com/jnape/palatable/lambda/adt/hmap/HMapTest.java
new file mode 100644
index 000000000..c89861eea
--- /dev/null
+++ b/src/test/java/com/jnape/palatable/lambda/adt/hmap/HMapTest.java
@@ -0,0 +1,173 @@
+package com.jnape.palatable.lambda.adt.hmap;
+
+import org.junit.Test;
+
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
+import static com.jnape.palatable.lambda.adt.hmap.HMap.emptyHMap;
+import static com.jnape.palatable.lambda.adt.hmap.HMap.hMap;
+import static com.jnape.palatable.lambda.adt.hmap.HMap.singletonHMap;
+import static com.jnape.palatable.lambda.adt.hmap.TypeSafeKey.typeSafeKey;
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static testsupport.matchers.IterableMatcher.iterates;
+
+public class HMapTest {
+
+ @Test
+ public void getForPresentKey() {
+ TypeSafeKey stringKey = typeSafeKey();
+ assertEquals(Optional.of("string value"),
+ new HMap(singletonMap(stringKey, "string value")).get(stringKey));
+ }
+
+ @Test
+ public void getForAbsentKey() {
+ assertEquals(Optional.empty(),
+ new HMap(singletonMap(typeSafeKey(), "string value")).get(typeSafeKey()));
+ }
+
+ @Test
+ public void getForPresentKeyWithNullValue() {
+ TypeSafeKey stringKey = typeSafeKey();
+ assertEquals(Optional.empty(),
+ new HMap(singletonMap(stringKey, null)).get(stringKey));
+ }
+
+ @Test
+ public void put() {
+ TypeSafeKey stringKey = typeSafeKey();
+ assertEquals(new HMap(singletonMap(stringKey, "string value")),
+ emptyHMap().put(stringKey, "string value"));
+
+ assertEquals(new HMap(singletonMap(stringKey, "new value")),
+ emptyHMap()
+ .put(stringKey, "string value")
+ .put(stringKey, "new value"));
+ }
+
+ @Test
+ public void putAll() {
+ TypeSafeKey stringKey1 = typeSafeKey();
+ TypeSafeKey stringKey2 = typeSafeKey();
+ TypeSafeKey intKey = typeSafeKey();
+
+ HMap left = hMap(stringKey1, "string value",
+ intKey, 1);
+ HMap right = hMap(stringKey2, "another string value",
+ intKey, 2);
+
+ assertEquals(hMap(stringKey1, "string value",
+ stringKey2, "another string value",
+ intKey, 2),
+ left.putAll(right));
+ assertEquals(hMap(stringKey1, "string value",
+ stringKey2, "another string value",
+ intKey, 1),
+ right.putAll(left));
+ }
+
+ @Test
+ public void containsKey() {
+ TypeSafeKey stringKey1 = typeSafeKey();
+ TypeSafeKey stringKey2 = typeSafeKey();
+ TypeSafeKey intKey = typeSafeKey();
+
+ HMap hMap = singletonHMap(stringKey1, "string");
+
+ assertTrue(hMap.containsKey(stringKey1));
+ assertFalse(hMap.containsKey(stringKey2));
+ assertFalse(hMap.containsKey(intKey));
+ }
+
+ @Test
+ public void demandForPresentKey() {
+ TypeSafeKey stringKey = typeSafeKey();
+ assertEquals("string value",
+ singletonHMap(stringKey, "string value").demand(stringKey));
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void demandForAbsentKey() {
+ emptyHMap().demand(typeSafeKey());
+ }
+
+ @Test
+ public void iteratesKVPairsAsTuples() {
+ TypeSafeKey stringKey = typeSafeKey();
+
+ assertThat(singletonHMap(stringKey, "string value"),
+ iterates(tuple(stringKey, "string value")));
+ }
+
+ @Test
+ public void keys() {
+ TypeSafeKey stringKey = typeSafeKey();
+
+ assertThat(singletonHMap(stringKey, "string value").keys(),
+ iterates(stringKey));
+ }
+
+ @Test
+ public void values() {
+ assertThat(singletonHMap(typeSafeKey(), "string value").values(),
+ iterates("string value"));
+ }
+
+ @Test
+ public void convenienceStaticFactoryMethods() {
+ TypeSafeKey stringKey = typeSafeKey();
+ TypeSafeKey intKey = typeSafeKey();
+ TypeSafeKey floatKey = typeSafeKey();
+ assertEquals(new HMap(emptyMap()), HMap.emptyHMap());
+ assertEquals(new HMap(singletonMap(stringKey, "string value")), HMap.singletonHMap(stringKey, "string value"));
+ assertEquals(emptyHMap().put(stringKey, "string value").put(intKey, 1),
+ hMap(stringKey, "string value",
+ intKey, 1));
+ assertEquals(emptyHMap().put(stringKey, "string value").put(intKey, 1).put(floatKey, 1f),
+ hMap(stringKey, "string value",
+ intKey, 1,
+ floatKey, 1f));
+ }
+
+ @Test
+ @SuppressWarnings("EqualsWithItself")
+ public void equality() {
+ assertTrue(emptyHMap().equals(emptyHMap()));
+
+ TypeSafeKey stringKey = typeSafeKey();
+ assertTrue(emptyHMap().put(stringKey, "one").equals(emptyHMap().put(stringKey, "one")));
+
+ assertFalse(emptyHMap().equals(emptyHMap().put(stringKey, "string key")));
+ assertFalse(emptyHMap().put(stringKey, "string key").equals(emptyHMap()));
+ assertFalse(emptyHMap().put(typeSafeKey(), "one").equals(emptyHMap().put(typeSafeKey(), "one")));
+ assertFalse(emptyHMap().put(typeSafeKey(), "one").equals(emptyHMap().put(typeSafeKey(), 1)));
+ assertFalse(emptyHMap().put(typeSafeKey(), 1).equals(emptyHMap().put(typeSafeKey(), "one")));
+ }
+
+ @Test
+ public void hashCodeUsesDecentDistribution() {
+ assertEquals(emptyHMap().hashCode(), emptyHMap().hashCode());
+ TypeSafeKey stringKey = typeSafeKey();
+ assertEquals(new HMap(singletonMap(stringKey, "string value")).hashCode(),
+ new HMap(singletonMap(stringKey, "string value")).hashCode());
+
+ assertNotEquals(emptyHMap(), new HMap(singletonMap(stringKey, "string value")));
+ assertNotEquals(new HMap(singletonMap(stringKey, "string value")),
+ new HMap(singletonMap(stringKey, "another string value")));
+
+ }
+
+ @Test
+ public void emptyHMapReusesInstance() {
+ assertSame(emptyHMap(), emptyHMap());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/tuples/Tuple2Test.java b/src/test/java/com/jnape/palatable/lambda/adt/tuples/Tuple2Test.java
deleted file mode 100644
index 4a183cd5e..000000000
--- a/src/test/java/com/jnape/palatable/lambda/adt/tuples/Tuple2Test.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.jnape.palatable.lambda.adt.tuples;
-
-import org.junit.Test;
-
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
-
-public class Tuple2Test {
-
- @Test
- public void hasTwoSlots() {
- Tuple2 stringIntTuple = tuple("foo", 1);
-
- assertThat(stringIntTuple._1, is("foo"));
- assertThat(stringIntTuple._2, is(1));
- }
-
- @Test
- public void toStringIsReasonable() {
- assertThat(tuple("1", "2").toString(), is("(1, 2)"));
- }
-
- @Test
- public void usesValueBasedEquality() {
- Tuple2 same = tuple("a", 1);
- Tuple2 alsoSame = tuple("a", 1);
- Tuple2 different = tuple("b", 2);
-
- assertEquals(same, alsoSame);
- assertEquals(alsoSame, same);
-
- assertNotEquals(same, different);
- assertNotEquals(alsoSame, different);
- assertNotEquals(different, same);
- assertNotEquals(different, alsoSame);
-
- assertNotEquals(same, new Object());
- }
-
- @Test
- public void hashesCorrectlyForEqualTuples() {
- assertEquals(tuple("foo", 1).hashCode(), tuple("foo", 1).hashCode());
- }
-
- @Test
- public void hashesUsingReasonableDistribution() {
- assertNotEquals(tuple("foo", 1).hashCode(), tuple("bar", 2).hashCode());
- }
-
- @Test
- public void functorialProperties() {
- assertThat(tuple("foo", 1).fmap(String::valueOf), is(tuple("foo", "1")));
- }
-
- @Test
- public void biFunctorialProperties() {
- assertThat(tuple("foo", 1).biMapL(String::toUpperCase), is(tuple("FOO", 1)));
- assertThat(tuple("foo", 1).biMapR(String::valueOf), is(tuple("foo", "1")));
- assertThat(tuple("foo", 1).biMap(String::toUpperCase, i -> i + 1), is(tuple("FOO", 2)));
- }
-}
diff --git a/src/test/java/com/jnape/palatable/lambda/adt/tuples/Tuple3Test.java b/src/test/java/com/jnape/palatable/lambda/adt/tuples/Tuple3Test.java
deleted file mode 100644
index e1cfc07bf..000000000
--- a/src/test/java/com/jnape/palatable/lambda/adt/tuples/Tuple3Test.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.jnape.palatable.lambda.adt.tuples;
-
-import org.junit.Test;
-
-import static com.jnape.palatable.lambda.adt.tuples.Tuple3.tuple;
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
-
-public class Tuple3Test {
-
- @Test
- public void hasThreeSlots() {
- Tuple3 integerStringCharacterTuple = tuple(1, "two", '3');
-
- assertThat(integerStringCharacterTuple._1, is(1));
- assertThat(integerStringCharacterTuple._2, is("two"));
- assertThat(integerStringCharacterTuple._3, is('3'));
- }
-
- @Test
- public void usesValueBasedEquality() {
- Tuple3 same = tuple("a", "b", 1);
- Tuple3 alsoSame = tuple("a", "b", 1);
- Tuple3 different = tuple("b", "b", 2);
-
- assertEquals(same, alsoSame);
- assertEquals(alsoSame, same);
-
- assertNotEquals(same, different);
- assertNotEquals(alsoSame, different);
- assertNotEquals(different, same);
- assertNotEquals(different, alsoSame);
-
- assertNotEquals(same, new Object());
- }
-
- @Test
- public void hashesCorrectlyForEqualTuples() {
- assertEquals(tuple("foo", "bar", 1).hashCode(), tuple("foo", "bar", 1).hashCode());
- }
-
- @Test
- public void hashesUsingReasonableDistribution() {
- assertNotEquals(tuple("foo", "bar", 1).hashCode(), tuple("bar", "baz", 2).hashCode());
- }
-
- @Test
- public void toStringIsReasonable() {
- assertThat(tuple("foo", "bar", "baz").toString(), is("(foo, bar, baz)"));
- }
-}
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/DyadicFunctionTest.java b/src/test/java/com/jnape/palatable/lambda/functions/DyadicFunctionTest.java
index dac5f6999..8ec963682 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/DyadicFunctionTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/DyadicFunctionTest.java
@@ -2,7 +2,7 @@
import org.junit.Test;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/TriadicFunctionTest.java b/src/test/java/com/jnape/palatable/lambda/functions/TriadicFunctionTest.java
index 115e61d0e..fd0d2478c 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/TriadicFunctionTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/TriadicFunctionTest.java
@@ -2,7 +2,7 @@
import org.junit.Test;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProductTest.java b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProductTest.java
index af678b616..d2813740e 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProductTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/CartesianProductTest.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.traitor.annotations.TestTraits;
import com.jnape.palatable.traitor.runners.Traits;
@@ -11,7 +11,7 @@
import testsupport.traits.ImmutableIteration;
import testsupport.traits.Laziness;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static com.jnape.palatable.lambda.functions.builtin.dyadic.CartesianProduct.cartesianProduct;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2Test.java b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2Test.java
index be0eb7a28..b909c6feb 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2Test.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Tupler2Test.java
@@ -2,7 +2,7 @@
import org.junit.Test;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static com.jnape.palatable.lambda.functions.builtin.dyadic.Tupler2.tupler;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/UnfoldrTest.java b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/UnfoldrTest.java
index 7a9722d73..9d53ee2f9 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/UnfoldrTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/UnfoldrTest.java
@@ -11,7 +11,7 @@
import java.util.Optional;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static com.jnape.palatable.lambda.functions.builtin.dyadic.Take.take;
import static com.jnape.palatable.lambda.functions.builtin.dyadic.Unfoldr.unfoldr;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/ZipTest.java b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/ZipTest.java
index 5955a417f..14efd3d28 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/ZipTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/builtin/dyadic/ZipTest.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.traitor.annotations.TestTraits;
import com.jnape.palatable.traitor.runners.Traits;
@@ -12,7 +12,7 @@
import java.util.Arrays;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static com.jnape.palatable.lambda.functions.builtin.dyadic.Zip.zip;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/com/jnape/palatable/lambda/functions/builtin/triadic/ZipWithTest.java b/src/test/java/com/jnape/palatable/lambda/functions/builtin/triadic/ZipWithTest.java
index d9b27f864..604a0ff15 100644
--- a/src/test/java/com/jnape/palatable/lambda/functions/builtin/triadic/ZipWithTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/functions/builtin/triadic/ZipWithTest.java
@@ -1,6 +1,6 @@
package com.jnape.palatable.lambda.functions.builtin.triadic;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.traitor.annotations.TestTraits;
@@ -11,7 +11,7 @@
import testsupport.traits.ImmutableIteration;
import testsupport.traits.Laziness;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static com.jnape.palatable.lambda.functions.builtin.dyadic.Zip.zip;
import static com.jnape.palatable.lambda.functions.builtin.triadic.ZipWith.zipWith;
import static java.util.Arrays.asList;
diff --git a/src/test/java/com/jnape/palatable/lambda/iterators/CombinatorialIteratorTest.java b/src/test/java/com/jnape/palatable/lambda/iterators/CombinatorialIteratorTest.java
index b7449b298..ecfa8faab 100644
--- a/src/test/java/com/jnape/palatable/lambda/iterators/CombinatorialIteratorTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/iterators/CombinatorialIteratorTest.java
@@ -1,6 +1,5 @@
package com.jnape.palatable.lambda.iterators;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -9,6 +8,7 @@
import java.util.Iterator;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.mockito.Mockito.when;
@@ -56,9 +56,9 @@ public void computesCombinationsInOrder() {
mockIteratorToHaveValues(as, "a1", "a2");
mockIteratorToHaveValues(bs, "b1", "b2");
- assertThat(combinatorialIterator.next(), is(Tuple2.tuple("a1", "b1")));
- assertThat(combinatorialIterator.next(), is(Tuple2.tuple("a1", "b2")));
- assertThat(combinatorialIterator.next(), is(Tuple2.tuple("a2", "b1")));
- assertThat(combinatorialIterator.next(), is(Tuple2.tuple("a2", "b2")));
+ assertThat(combinatorialIterator.next(), is(tuple("a1", "b1")));
+ assertThat(combinatorialIterator.next(), is(tuple("a1", "b2")));
+ assertThat(combinatorialIterator.next(), is(tuple("a2", "b1")));
+ assertThat(combinatorialIterator.next(), is(tuple("a2", "b2")));
}
}
diff --git a/src/test/java/com/jnape/palatable/lambda/iterators/UnfoldingIteratorTest.java b/src/test/java/com/jnape/palatable/lambda/iterators/UnfoldingIteratorTest.java
index 0029e5e69..85574e661 100644
--- a/src/test/java/com/jnape/palatable/lambda/iterators/UnfoldingIteratorTest.java
+++ b/src/test/java/com/jnape/palatable/lambda/iterators/UnfoldingIteratorTest.java
@@ -1,12 +1,12 @@
package com.jnape.palatable.lambda.iterators;
-import com.jnape.palatable.lambda.adt.tuples.Tuple2;
+import com.jnape.palatable.lambda.adt.hlist.Tuple2;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import org.junit.Test;
import java.util.Optional;
-import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
diff --git a/src/test/java/testsupport/applicatives/InvocationRecordingBifunctor.java b/src/test/java/testsupport/applicatives/InvocationRecordingBifunctor.java
index 86fa80278..191df47c6 100644
--- a/src/test/java/testsupport/applicatives/InvocationRecordingBifunctor.java
+++ b/src/test/java/testsupport/applicatives/InvocationRecordingBifunctor.java
@@ -17,10 +17,10 @@ public InvocationRecordingBifunctor(AtomicReference leftFn,
@Override
@SuppressWarnings("unchecked")
- public Bifunctor biMap(MonadicFunction super A, ? extends C> f1,
- MonadicFunction super B, ? extends D> f2) {
- leftFn.set(f1);
- rightFn.set(f2);
+ public Bifunctor biMap(MonadicFunction super A, ? extends C> lFn,
+ MonadicFunction super B, ? extends D> rFn) {
+ leftFn.set(lFn);
+ rightFn.set(rFn);
return (Bifunctor) this;
}
}