From 68faea64a4b1ef23acba209ad502e4458eb16290 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Mon, 29 Feb 2016 09:50:20 -0500 Subject: Implemented lazy variant of IHolder --- .../src/main/java/bjc/utils/data/LazyHolder.java | 90 ++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/data/LazyHolder.java (limited to 'BJC-Utils2/src/main/java/bjc/utils') diff --git a/BJC-Utils2/src/main/java/bjc/utils/data/LazyHolder.java b/BJC-Utils2/src/main/java/bjc/utils/data/LazyHolder.java new file mode 100644 index 0000000..db5b6ef --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/data/LazyHolder.java @@ -0,0 +1,90 @@ +package bjc.utils.data; + +import java.util.function.Function; +import java.util.function.Supplier; + +import bjc.utils.funcdata.FunctionalList; + +/** + * Holds a single value of a specific type. This is used for indirect + * references to data, and more specifically for accessing non-final + * variables from a lambda. AKA the identity monad + * + * This is a lazy variant of {@link IHolder} + * + * @author ben + * + * @param + * The type of the data being held + */ +public class LazyHolder implements IHolder { + /** + * The source for a value held by this lazy holder + */ + private Supplier heldSrc; + + /** + * The value internally held by this lazy holder + */ + private T held; + + /** + * List of queued actions to be performed on realized values + */ + private FunctionalList> actions; + + /** + * Create a new lazy holder with the given supplier + * + * @param src + * The supplier for a value when it is neededs + */ + public LazyHolder(Supplier src) { + heldSrc = src; + + held = null; + } + + /** + * Create a new lazy holder with the given value + * + * @param val + * The value held in the holder + */ + public LazyHolder(T val) { + held = val; + } + + @Override + public IHolder map(Function f) { + return new LazyHolder(() -> { + if (held == null) { + return actions.reduceAux(heldSrc.get(), + Function::apply, f::apply); + } else { + return actions.reduceAux(held, Function::apply, + f::apply); + } + }); + } + + @Override + public IHolder transform(Function f) { + actions.add(f); + + return this; + } + + @Override + public E unwrap(Function f) { + // Actualize ourselves + if (held == null) { + held = heldSrc.get(); + } + + actions.forEach((act) -> held = act.apply(held)); + + return f.apply(held); + } + +} -- cgit v1.2.3