diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-04-11 17:08:54 -0400 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2016-04-11 17:08:54 -0400 |
| commit | a716a7a53f85a6901128896da508d31c172011b4 (patch) | |
| tree | e0fff5f4f9c7a92f86f006966a3cc863edee030f /BJC-Utils2/src/main/java/bjc/utils/data/experimental/IHolder.java | |
| parent | 9fbd262dabfc74bf134855597815642bc4e3665c (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.java | 85 |
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); +} |
