package bjc.utils.data; import java.util.function.Function; /** * 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 * * @author ben * * @param * The type of the data being held */ public class GenHolder { /** * The state this holder is responsible for. */ public T held; /** * Creates a new empty holder, with its state set to null */ public GenHolder() { held = null; } /** * Creates a new holder, with its state initialized to the provided * value * * @param held * The state to initialize this holder to. */ public GenHolder(T hld) { held = hld; } /** * Return the result of applying the given transformation to the held * value Doesn't change the held value * * @param f * The transformation to apply * @return A holder with the transformed value */ public GenHolder map(Function f) { return new GenHolder(f.apply(held)); } /** * Apply the given transformation to the held value. Returns the holder * for allowing chaining of transforms * * @param f * The transform to apply to the value * @return The holder */ public GenHolder transform(Function f) { held = f.apply(held); return this; } /** * Returns a raw mapped value, not contained in a GenHolder * * @param f * The function to use for mapping the value * @return The mapped value outside of a GenHolder */ public E unwrap(Function f) { return f.apply(held); } }