package org.zwobble.couscous.util; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import java.util.function.BiFunction; public class Fold { public static V foldLeft(Iterable iterable, V initialValue, BiFunction function) { V value = initialValue; for (T element : iterable) { value = function.apply(value, element); } return value; } public static T foldLeft(Iterable iterable, BiFunction function) { Iterator iterator = iterable.iterator(); T value = iterator.next(); while (iterator.hasNext()) { value = function.apply(value, iterator.next()); } return value; } public static V foldRight(List iterable, V initialValue, BiFunction function) { return foldLeft(Lists.reverse(iterable), initialValue, function); } }