, Boolean> any(MonadicFunction su
}
public static Boolean any(MonadicFunction super A, Boolean> predicate, Iterable as) {
- return any(predicate).apply(as);
+ return Any.any(predicate).apply(as);
}
}
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 ce76c57d5..159e1f8b6 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,14 +1,31 @@
package com.jnape.palatable.lambda.functions.builtin.dyadic;
+import com.jnape.palatable.lambda.adt.tuples.Tuple2;
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.CombinatorialIterator;
-import com.jnape.palatable.lambda.tuples.Tuple2;
+/**
+ * Lazily compute the cartesian product of an Iterable<A> and Iterable<B>,
+ * returning an Iterable<Tuple2<A, B>>, the products as tuples of
+ * multiplicand As and multiplier Bs.
+ *
+ * Note that this algorithm exhaustively pairs all elements from Iterable<B> to the first element of
+ * Iterable<A> before advancing to the next element of Iterable<A>, so if
+ * Iterable<B> is infinite, only one element from Iterable<A> will ever be
+ * paired.
+ *
+ * @param The multiplicand Iterable element type
+ * @param The multiplier Iterable element type
+ * @see Zip
+ */
public final class CartesianProduct implements DyadicFunction, Iterable, Iterable>> {
+ private CartesianProduct() {
+ }
+
@Override
- public final Iterable> apply(final Iterable as, final Iterable bs) {
+ public Iterable> apply(Iterable as, Iterable bs) {
return () -> new CombinatorialIterator<>(as.iterator(), bs.iterator());
}
@@ -20,7 +37,7 @@ public static MonadicFunction, Iterable>> cartes
return CartesianProduct.cartesianProduct().apply(as);
}
- public static Iterable> cartesianProduct(final Iterable as, final Iterable bs) {
+ public static Iterable> cartesianProduct(Iterable as, Iterable bs) {
return CartesianProduct.cartesianProduct(as).apply(bs);
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Drop.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Drop.java
index ffc02e099..537fa015e 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Drop.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Drop.java
@@ -4,10 +4,22 @@
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.DroppingIterator;
+/**
+ * Lazily skip the first n elements from an Iterable by returning an Iterable
+ * that begins iteration after the nth element. If n is greater than or equal to the length of
+ * the Iterable, an empty Iterable is returned.
+ *
+ * @param The Iterable element type
+ * @see DropWhile
+ * @see Take
+ */
public final class Drop implements DyadicFunction, Iterable> {
+ private Drop() {
+ }
+
@Override
- public final Iterable apply(final Integer n, final Iterable as) {
+ public Iterable apply(Integer n, Iterable as) {
return () -> new DroppingIterator<>(n, as.iterator());
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/DropWhile.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/DropWhile.java
index 1b12aae0e..676eef969 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/DropWhile.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/DropWhile.java
@@ -4,9 +4,23 @@
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.PredicatedDroppingIterator;
+/**
+ * Lazily limit the Iterable by skipping the first contiguous group of elements that satisfy the predicate,
+ * beginning iteration at the first element for which the predicate evaluates to false.
+ *
+ * @param The Iterable element type
+ * @see Drop
+ * @see Filter
+ * @see TakeWhile
+ */
+
public final class DropWhile implements DyadicFunction, Iterable, Iterable> {
+
+ private DropWhile() {
+ }
+
@Override
- public final Iterable apply(final MonadicFunction super A, Boolean> predicate, final Iterable as) {
+ public Iterable apply(MonadicFunction super A, Boolean> predicate, Iterable as) {
return () -> new PredicatedDroppingIterator<>(predicate, as.iterator());
}
@@ -20,7 +34,6 @@ public static MonadicFunction, Iterable> dropWhile(
}
public static Iterable dropWhile(MonadicFunction super A, Boolean> predicate, Iterable as) {
- return dropWhile(predicate).apply(as);
+ return DropWhile.dropWhile(predicate).apply(as);
}
-
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Filter.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Filter.java
index e40a63784..394faf487 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Filter.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Filter.java
@@ -4,10 +4,21 @@
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.FilteringIterator;
+/**
+ * Lazily apply a predicate to each element in an Iterable, returning an Iterable of just the
+ * elements for which the predicate evaluated to true.
+ *
+ * @param A type contravariant to the input Iterable element type
+ * @see TakeWhile
+ * @see DropWhile
+ */
public final class Filter implements DyadicFunction, Iterable, Iterable> {
+ private Filter() {
+ }
+
@Override
- public final Iterable apply(final MonadicFunction super A, Boolean> predicate, final Iterable as) {
+ public Iterable apply(MonadicFunction super A, Boolean> predicate, Iterable as) {
return () -> new FilteringIterator<>(predicate, as.iterator());
}
@@ -15,12 +26,11 @@ public static Filter filter() {
return new Filter<>();
}
- public static MonadicFunction, Iterable> filter(
- final MonadicFunction super A, Boolean> predicate) {
+ public static MonadicFunction, Iterable> filter(MonadicFunction super A, Boolean> predicate) {
return Filter.filter().apply(predicate);
}
- public static Iterable filter(final MonadicFunction super A, Boolean> predicate, final Iterable as) {
- return filter(predicate).apply(as);
+ public static Iterable filter(MonadicFunction super A, Boolean> predicate, Iterable as) {
+ return Filter.filter(predicate).apply(as);
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/InGroupsOf.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/InGroupsOf.java
index 6edb9d831..f2438aead 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/InGroupsOf.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/InGroupsOf.java
@@ -4,10 +4,21 @@
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.GroupingIterator;
+/**
+ * Lazily group the Iterable by returning an Iterable of smaller Iterables of
+ * size k. Note that groups are not padded; that is, if k >= n, where
+ * n is the number of remaining elements, the final Iterable will have only n
+ * elements.
+ *
+ * @param The Iterable element type
+ */
public final class InGroupsOf implements DyadicFunction, Iterable>> {
+ private InGroupsOf() {
+ }
+
@Override
- public final Iterable> apply(final Integer k, final Iterable as) {
+ public Iterable> apply(Integer k, Iterable as) {
return () -> new GroupingIterator<>(k, as.iterator());
}
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 2fcdc44d9..22e2a169a 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,12 +6,22 @@
import java.util.Optional;
-import static com.jnape.palatable.lambda.tuples.Tuple2.tuple;
-
+import static com.jnape.palatable.lambda.adt.tuples.Tuple2.tuple;
+
+/**
+ * Lazily generate an infinite Iterable from the successive applications of the function first to the
+ * initial seed value, then to the result, and so on; i.e., the result of iterate(x -> x + 1, 0) would
+ * produce an infinite Iterable over the elements 0, 1, 2, 3, ... and so on.
+ *
+ * @param The Iterable element type
+ */
public final class Iterate implements DyadicFunction, A, Iterable> {
+ private Iterate() {
+ }
+
@Override
- public final Iterable apply(final MonadicFunction super A, ? extends A> fn, final A seed) {
+ public Iterable apply(MonadicFunction super A, ? extends A> fn, A seed) {
return () -> new UnfoldingIterator<>(a -> Optional.of(tuple(a, fn.apply(a))), seed);
}
@@ -24,6 +34,6 @@ public static MonadicFunction> iterate(MonadicFunction supe
}
public static Iterable iterate(MonadicFunction super A, ? extends A> fn, A seed) {
- return iterate(fn).apply(seed);
+ return Iterate.iterate(fn).apply(seed);
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Map.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Map.java
index c64b9202a..47e77e3b8 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Map.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Map.java
@@ -4,10 +4,20 @@
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.iterators.MappingIterator;
+/**
+ * Lazily apply a function to each element in an Iterable, producing an Iterable of the mapped
+ * results.
+ *
+ * @param A type contravariant to the input Iterable element type
+ * @param A type covariant to the output Iterable element type
+ */
public final class Map implements DyadicFunction, Iterable, Iterable> {
+ private Map() {
+ }
+
@Override
- public final Iterable apply(final MonadicFunction super A, ? extends B> function, final Iterable as) {
+ public Iterable apply(MonadicFunction super A, ? extends B> function, Iterable as) {
return () -> new MappingIterator<>(function, as.iterator());
}
@@ -21,6 +31,6 @@ public static MonadicFunction, Iterable> map(
}
public static Iterable map(MonadicFunction super A, ? extends B> function, Iterable as) {
- return map(function).apply(as);
+ return Map.map(function).apply(as);
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial2.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial2.java
index 6ba8c94a4..2990dac51 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial2.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial2.java
@@ -3,8 +3,20 @@
import com.jnape.palatable.lambda.functions.DyadicFunction;
import com.jnape.palatable.lambda.functions.MonadicFunction;
+/**
+ * Partially apply (fix) the first argument of a DyadicFunction, producing a MonadicFunction
+ * that takes the remaining argument. This is isomorphic to calling {@link com.jnape.palatable.lambda.functions.DyadicFunction#apply(Object)}.
+ *
+ * @param The type of the value to be supplied
+ * @param The input argument type of the resulting function
+ * @param The return type of the resulting function
+ * @see Partial3
+ */
public final class Partial2 implements DyadicFunction, A, MonadicFunction> {
+ private Partial2() {
+ }
+
@Override
public MonadicFunction apply(DyadicFunction function, A a) {
return function.apply(a);
@@ -18,7 +30,7 @@ public static MonadicFunction> partial2(Dyadi
return Partial2.partial2().apply(new Partial2<>(), function);
}
- public static MonadicFunction partial2(DyadicFunction function, final A a) {
+ public static MonadicFunction partial2(DyadicFunction function, A a) {
return partial2(function).apply(a);
}
}
diff --git a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial3.java b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial3.java
index 9bdf0c71c..cb1423b01 100644
--- a/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial3.java
+++ b/src/main/java/com/jnape/palatable/lambda/functions/builtin/dyadic/Partial3.java
@@ -4,8 +4,21 @@
import com.jnape.palatable.lambda.functions.MonadicFunction;
import com.jnape.palatable.lambda.functions.TriadicFunction;
+/**
+ * Partially apply (fix) the first argument of a TriadicFunction, producing a DyadicFunction
+ * that takes the remaining two argument. This is isomorphic to calling {@link com.jnape.palatable.lambda.functions.TriadicFunction#apply(Object)}.
+ *
+ * @param The type of the value to be supplied
+ * @param The first input argument type of the resulting function
+ * @param The second input argument type of the resulting function
+ * @param The return type of the resulting function
+ * @see Partial2
+ */
public final class Partial3 implements DyadicFunction