summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2016-04-11 17:08:54 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2016-04-11 17:08:54 -0400
commita716a7a53f85a6901128896da508d31c172011b4 (patch)
treee0fff5f4f9c7a92f86f006966a3cc863edee030f /BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java
parent9fbd262dabfc74bf134855597815642bc4e3665c (diff)
Initial commit of experimental data rewrite
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java b/BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java
new file mode 100644
index 0000000..2767897
--- /dev/null
+++ b/BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java
@@ -0,0 +1,85 @@
+package bjc.utils.data.experimental;
+
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
+
+/**
+ * A holder of a single value.
+ *
+ * @author ben
+ *
+ * @param <ContainedType>
+ * The type of value held
+ */
+public interface IHolder<ContainedType> {
+ /**
+ * Bind a function across the value in this container
+ * @param <BoundType> The type of value in this container
+ * @param binder The function to bind to the value
+ * @return A holder from binding the value
+ */
+ public <BoundType> IHolder<BoundType> bind(
+ Function<ContainedType, IHolder<BoundType>> binder);
+
+ /**
+ * Apply an action to the value
+ *
+ * @param action
+ * The action to apply to the value
+ */
+ public default void doWith(Consumer<ContainedType> action) {
+ transform((value) -> {
+ action.accept(value);
+
+ return value;
+ });
+ }
+
+ /**
+ * Get the value contained in this holder without changing it.
+ *
+ * @return The value held in this holder
+ */
+ public default ContainedType getValue() {
+ return unwrap((value) -> value);
+ }
+
+ /**
+ * Create a new holder with a mapped version of the value in this
+ * holder.
+ *
+ * Does not change the internal state of this holder
+ *
+ * @param <MappedType>
+ * The type of the mapped value
+ * @param mapper
+ * The function to do mapping with
+ * @return A holder with the mapped value
+ */
+ public <MappedType> IHolder<MappedType> map(
+ Function<ContainedType, MappedType> mapper);
+
+ /**
+ * Transform the value held in this holder
+ *
+ * @param transformer
+ * The function to transform the value with
+ * @return The holder itself, for easy chaining
+ */
+ public IHolder<ContainedType> transform(
+ UnaryOperator<ContainedType> transformer);
+
+ /**
+ * Unwrap the value contained in this holder so that it is no longer
+ * held
+ *
+ * @param <UnwrappedType>
+ * The type of the unwrapped value
+ * @param unwrapper
+ * The function to use to unwrap the value
+ * @return The unwrapped held value
+ */
+ public <UnwrappedType> UnwrappedType unwrap(
+ Function<ContainedType, UnwrappedType> unwrapper);
+}