From 002516bd03b2ea3f731c8139c9a5f716902ab702 Mon Sep 17 00:00:00 2001 From: Ben Culkin Date: Tue, 7 Apr 2020 21:03:53 -0400 Subject: Finish remove utils.data utils.data now lives in the esodata project; not in this one --- .../java/bjc/utils/data/internals/BoundLazy.java | 137 ------------- .../bjc/utils/data/internals/BoundLazyPair.java | 228 --------------------- .../bjc/utils/data/internals/BoundListHolder.java | 81 -------- .../utils/data/internals/HalfBoundLazyPair.java | 177 ---------------- .../java/bjc/utils/data/internals/WrappedLazy.java | 83 -------- .../bjc/utils/data/internals/WrappedOption.java | 96 --------- 6 files changed, 802 deletions(-) delete mode 100644 base/src/main/java/bjc/utils/data/internals/BoundLazy.java delete mode 100644 base/src/main/java/bjc/utils/data/internals/BoundLazyPair.java delete mode 100644 base/src/main/java/bjc/utils/data/internals/BoundListHolder.java delete mode 100644 base/src/main/java/bjc/utils/data/internals/HalfBoundLazyPair.java delete mode 100644 base/src/main/java/bjc/utils/data/internals/WrappedLazy.java delete mode 100644 base/src/main/java/bjc/utils/data/internals/WrappedOption.java (limited to 'base/src/main/java/bjc/utils/data/internals') diff --git a/base/src/main/java/bjc/utils/data/internals/BoundLazy.java b/base/src/main/java/bjc/utils/data/internals/BoundLazy.java deleted file mode 100644 index f4e8f7e..0000000 --- a/base/src/main/java/bjc/utils/data/internals/BoundLazy.java +++ /dev/null @@ -1,137 +0,0 @@ -package bjc.utils.data.internals; - -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; - -import bjc.utils.data.IHolder; -import bjc.utils.data.Lazy; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; - -/** - * Implements a lazy holder that has been bound. - * - * @author Ben Culkin - */ -@SuppressWarnings("javadoc") -public class BoundLazy implements IHolder { - /* The old value. */ - private final Supplier> oldSupplier; - - /* The function to use to transform the old value into a new value. */ - private final Function> binder; - - /* The bound value being held. */ - private IHolder boundHolder; - - /* Whether the bound value has been actualized or not. */ - private boolean holderBound; - - /* Transformations currently pending on the bound value. */ - private final IList> actions = new FunctionalList<>(); - - /** - * Create a new bound lazy value. - * - * @param supp - * The supplier of the old value. - * - * @param binder - * The function to use to bind the old value to the new one. - */ - public BoundLazy(final Supplier> supp, - final Function> binder) { - oldSupplier = supp; - this.binder = binder; - } - - @Override - public IHolder bind(final Function> bindr) { - if(bindr == null) throw new NullPointerException("Binder must not be null"); - - /* Prepare a list of pending actions. */ - final IList> pendingActions = new FunctionalList<>(); - actions.forEach(pendingActions::add); - - /* Create the new supplier of a value. */ - final Supplier> typeSupplier = () -> { - IHolder oldHolder = boundHolder; - - /* Bind the value if it hasn't been bound before. */ - if(!holderBound) { - oldHolder = oldSupplier.get().unwrap(binder); - } - - /* Apply all the pending actions. */ - return pendingActions.reduceAux(oldHolder, (action, state) -> { - return state.transform(action); - }, (value) -> value); - }; - - return new BoundLazy<>(typeSupplier, bindr); - } - - @Override - public Function> lift( - final Function func) { - if(func == null) throw new NullPointerException("Function to lift must not be null"); - - return (val) -> { - return new Lazy<>(func.apply(val)); - }; - } - - @Override - public IHolder map(final Function mapper) { - if(mapper == null) throw new NullPointerException("Mapper must not be null"); - - /* Prepare a list of pending actions. */ - final IList> pendingActions = new FunctionalList<>(); - actions.forEach(pendingActions::add); - - /* Prepare the new supplier. */ - final Supplier typeSupplier = () -> { - IHolder oldHolder = boundHolder; - - /* Bound the value if it hasn't been bound. */ - if(!holderBound) { - oldHolder = oldSupplier.get().unwrap(binder); - } - - /* Apply pending actions. */ - return pendingActions.reduceAux(oldHolder.getValue(), (action, state) -> { - return action.apply(state); - }, (value) -> mapper.apply(value)); - }; - - return new Lazy<>(typeSupplier); - } - - @Override - public String toString() { - if(holderBound) return boundHolder.toString(); - - return "(unmaterialized)"; - } - - @Override - public IHolder transform(final UnaryOperator transformer) { - if(transformer == null) throw new NullPointerException("Transformer must not be null"); - - actions.add(transformer); - - return this; - } - - @Override - public UnwrappedType unwrap(final Function unwrapper) { - if(unwrapper == null) throw new NullPointerException("Unwrapper must not be null"); - - if(!holderBound) { - boundHolder = oldSupplier.get().unwrap(binder::apply); - } - - return boundHolder.unwrap(unwrapper); - } -} diff --git a/base/src/main/java/bjc/utils/data/internals/BoundLazyPair.java b/base/src/main/java/bjc/utils/data/internals/BoundLazyPair.java deleted file mode 100644 index 2ef0e4c..0000000 --- a/base/src/main/java/bjc/utils/data/internals/BoundLazyPair.java +++ /dev/null @@ -1,228 +0,0 @@ -package bjc.utils.data.internals; - -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -import bjc.utils.data.IHolder; -import bjc.utils.data.IPair; -import bjc.utils.data.Identity; -import bjc.utils.data.LazyPair; - -/** - * Implements a lazy pair that has been bound. - * - * @author Ben Culkin - */ -@SuppressWarnings("javadoc") -public class BoundLazyPair implements IPair { - /* The supplier of the left value. */ - private final Supplier leftSupplier; - /* The supplier of the right value. */ - private final Supplier rightSupplier; - - /* The binder to transform values. */ - private final BiFunction> binder; - - /* The bound pair. */ - private IPair boundPair; - - /* Whether the pair has been bound yet. */ - private boolean pairBound; - - /** - * Create a new bound lazy pair. - * - * @param leftSupp - * The supplier for the left value. - * - * @param rightSupp - * The supplier for the right value. - * - * @param bindr - * The function to use to bind the left and right into a new - * pair. - */ - public BoundLazyPair(final Supplier leftSupp, final Supplier rightSupp, - final BiFunction> bindr) { - leftSupplier = leftSupp; - rightSupplier = rightSupp; - binder = bindr; - } - - @Override - public IPair bind( - final BiFunction> bindr) { - if(bindr == null) throw new NullPointerException("Binder must not be null"); - - final IHolder> newPair = new Identity<>(boundPair); - final IHolder newPairMade = new Identity<>(pairBound); - - final Supplier leftSupp = () -> { - if(!newPairMade.getValue()) { - /* - * If the pair hasn't been bound before, bind - * it. - */ - newPair.replace(binder.apply(leftSupplier.get(), rightSupplier.get())); - - newPairMade.replace(true); - } - - return newPair.unwrap((pair) -> pair.getLeft()); - }; - - final Supplier rightSupp = () -> { - if(!newPairMade.getValue()) { - /* - * If the pair hasn't been bound before, bind - * it. - */ - newPair.replace(binder.apply(leftSupplier.get(), rightSupplier.get())); - - newPairMade.replace(true); - } - - return newPair.unwrap((pair) -> pair.getRight()); - }; - - return new BoundLazyPair<>(leftSupp, rightSupp, bindr); - } - - @Override - public IPair bindLeft( - final Function> leftBinder) { - if(leftBinder == null) throw new NullPointerException("Left binder must not be null"); - - final Supplier leftSupp = () -> { - IPair newPair = boundPair; - - if(!pairBound) { - /* - * If the pair hasn't been bound before, bind - * it. - */ - newPair = binder.apply(leftSupplier.get(), rightSupplier.get()); - } - - return newPair.getLeft(); - }; - - return new HalfBoundLazyPair<>(leftSupp, leftBinder); - } - - @Override - public IPair bindRight( - final Function> rightBinder) { - if(rightBinder == null) throw new NullPointerException("Right binder must not be null"); - - final Supplier rightSupp = () -> { - IPair newPair = boundPair; - - if(!pairBound) { - /* - * If the pair hasn't been bound before, bind - * it. - */ - newPair = binder.apply(leftSupplier.get(), rightSupplier.get()); - } - - return newPair.getRight(); - }; - - return new HalfBoundLazyPair<>(rightSupp, rightBinder); - } - - @Override - public IPair combine( - final IPair otherPair, - final BiFunction leftCombiner, - final BiFunction rightCombiner) { - if(otherPair == null) { - throw new NullPointerException("Other pair must not be null"); - } else if(leftCombiner == null) { - throw new NullPointerException("Left combiner must not be null"); - } else if(rightCombiner == null) { - throw new NullPointerException("Right combiner must not be null"); - } - - return otherPair.bind((otherLeft, otherRight) -> { - return bind((leftVal, rightVal) -> { - CombinedLeft cLeft = leftCombiner.apply(leftVal, otherLeft); - CombinedRight cRight = rightCombiner.apply(rightVal, otherRight); - - return new LazyPair<>(cLeft, cRight); - }); - }); - } - - @Override - public IPair mapLeft(final Function mapper) { - if(mapper == null) throw new NullPointerException("Mapper must not be null"); - - final Supplier leftSupp = () -> { - if(!pairBound) { - final NewLeft leftVal = binder.apply(leftSupplier.get(), rightSupplier.get()).getLeft(); - - return mapper.apply(leftVal); - } - - return mapper.apply(boundPair.getLeft()); - }; - - final Supplier rightSupp = () -> { - if(!pairBound) return binder.apply(leftSupplier.get(), rightSupplier.get()).getRight(); - - return boundPair.getRight(); - }; - - return new LazyPair<>(leftSupp, rightSupp); - } - - @Override - public IPair mapRight(final Function mapper) { - if(mapper == null) throw new NullPointerException("Mapper must not be null"); - - final Supplier leftSupp = () -> { - if(!pairBound) return binder.apply(leftSupplier.get(), rightSupplier.get()).getLeft(); - - return boundPair.getLeft(); - }; - - final Supplier rightSupp = () -> { - if(!pairBound) { - final NewRight rightVal = binder.apply(leftSupplier.get(), rightSupplier.get()) - .getRight(); - - return mapper.apply(rightVal); - } - - return mapper.apply(boundPair.getRight()); - }; - - return new LazyPair<>(leftSupp, rightSupp); - } - - @Override - public MergedType merge(final BiFunction merger) { - if(merger == null) throw new NullPointerException("Merger must not be null"); - - if(!pairBound) { - /* - * If the pair isn't bound yet, bind it. - */ - boundPair = binder.apply(leftSupplier.get(), rightSupplier.get()); - - pairBound = true; - } - - return boundPair.merge(merger); - } - - @Override - public String toString() { - if(pairBound) return boundPair.toString(); - - return "(un-materialized)"; - } -} diff --git a/base/src/main/java/bjc/utils/data/internals/BoundListHolder.java b/base/src/main/java/bjc/utils/data/internals/BoundListHolder.java deleted file mode 100644 index 613f8e9..0000000 --- a/base/src/main/java/bjc/utils/data/internals/BoundListHolder.java +++ /dev/null @@ -1,81 +0,0 @@ -package bjc.utils.data.internals; - -import java.util.function.Function; -import java.util.function.UnaryOperator; - -import bjc.utils.data.IHolder; -import bjc.utils.data.ListHolder; -import bjc.utils.funcdata.IList; - -/** - * Holds a list, converted into a holder. - * - * @author Ben Culkin - */ -@SuppressWarnings("javadoc") -public class BoundListHolder implements IHolder { - /* The list of contained holders. */ - private final IList> heldHolders; - - /** - * Create a new list of holders. - * - * @param toHold - * The list of holders to, well, hold. - */ - public BoundListHolder(final IList> toHold) { - heldHolders = toHold; - } - - @Override - public IHolder bind(final Function> binder) { - if(binder == null) throw new NullPointerException("Binder must not be null"); - - final IList> boundHolders = heldHolders.map((containedHolder) -> { - return containedHolder.bind(binder); - }); - - return new BoundListHolder<>(boundHolders); - } - - @Override - public Function> lift(final Function func) { - if(func == null) throw new NullPointerException("Function to lift must not be null"); - - return (val) -> { - return new ListHolder<>(func.apply(val)); - }; - } - - @Override - public IHolder map(final Function mapper) { - if(mapper == null) throw new NullPointerException("Mapper must not be null"); - - final IList> mappedHolders = heldHolders.map((containedHolder) -> { - return containedHolder.map(mapper); - }); - - return new BoundListHolder<>(mappedHolders); - } - - @Override - public IHolder transform(final UnaryOperator transformer) { - if(transformer == null) throw new NullPointerException("Transformer must not be null"); - - heldHolders.forEach((containedHolder) -> { - containedHolder.transform(transformer); - }); - - return this; - } - - @Override - public UnwrappedType unwrap(final Function unwrapper) { - if(unwrapper == null) throw new NullPointerException("Unwrapper must not be null"); - - /* - * @NOTE Is there another way we could want to do this? - */ - return heldHolders.randItem().unwrap(unwrapper); - } -} diff --git a/base/src/main/java/bjc/utils/data/internals/HalfBoundLazyPair.java b/base/src/main/java/bjc/utils/data/internals/HalfBoundLazyPair.java deleted file mode 100644 index 4803bc2..0000000 --- a/base/src/main/java/bjc/utils/data/internals/HalfBoundLazyPair.java +++ /dev/null @@ -1,177 +0,0 @@ -package bjc.utils.data.internals; - -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -import bjc.utils.data.IHolder; -import bjc.utils.data.IPair; -import bjc.utils.data.Identity; -import bjc.utils.data.LazyPair; - -/* - * @NOTE - * I am not convinced that this code works correctly. Tests should be - * written to make sure things only ever get instantiated once. - * - * Namely, my main concern is to whether the places that bind the pair - * without setting pairBound are doing the right thing. - */ -/** - * A lazy pair, with only one side bound. - * - * @author Ben Culkin - */ -@SuppressWarnings("javadoc") -public class HalfBoundLazyPair implements IPair { - /* The supplier of the old value. */ - private final Supplier oldSupplier; - - /* The function to transform the old value into a new pair. */ - private final Function> binder; - - /* The new bound pair. */ - private IPair boundPair; - /* Has the pair been bound yet or not? */ - private boolean pairBound; - - /** - * Create a new half-bound lazy pair. - * - * @param oldSupp - * The supplier of the old value. - * - * @param bindr - * The function to use to create the pair from the old value. - */ - public HalfBoundLazyPair(final Supplier oldSupp, - final Function> bindr) { - oldSupplier = oldSupp; - binder = bindr; - } - - @Override - public IPair bind( - final BiFunction> bindr) { - final IHolder> newPair = new Identity<>(boundPair); - final IHolder newPairMade = new Identity<>(pairBound); - - final Supplier leftSupp = () -> { - if(!newPairMade.getValue()) { - /* Bind the pair if it hasn't been bound yet. */ - newPair.replace(binder.apply(oldSupplier.get())); - newPairMade.replace(true); - } - - return newPair.unwrap((pair) -> pair.getLeft()); - }; - - final Supplier rightSupp = () -> { - if(!newPairMade.getValue()) { - /* Bind the pair if it hasn't been bound yet. */ - newPair.replace(binder.apply(oldSupplier.get())); - newPairMade.replace(true); - } - - return newPair.unwrap((pair) -> pair.getRight()); - }; - - return new BoundLazyPair<>(leftSupp, rightSupp, bindr); - } - - @Override - public IPair bindLeft( - final Function> leftBinder) { - final Supplier leftSupp = () -> { - IPair newPair = boundPair; - - if(!pairBound) { - newPair = binder.apply(oldSupplier.get()); - } - - return newPair.getLeft(); - }; - - return new HalfBoundLazyPair<>(leftSupp, leftBinder); - } - - @Override - public IPair bindRight( - final Function> rightBinder) { - final Supplier rightSupp = () -> { - IPair newPair = boundPair; - - if(!pairBound) { - newPair = binder.apply(oldSupplier.get()); - } - - return newPair.getRight(); - }; - - return new HalfBoundLazyPair<>(rightSupp, rightBinder); - } - - @Override - public IPair combine( - final IPair otherPair, - final BiFunction leftCombiner, - final BiFunction rightCombiner) { - return otherPair.bind((otherLeft, otherRight) -> { - return bind((leftVal, rightVal) -> { - CombinedLeft cLeft = leftCombiner.apply(leftVal, otherLeft); - CombinedRight cRight = rightCombiner.apply(rightVal, otherRight); - - return new LazyPair<>(cLeft, cRight); - }); - }); - } - - @Override - public IPair mapLeft(final Function mapper) { - final Supplier leftSupp = () -> { - if(pairBound) return mapper.apply(boundPair.getLeft()); - - final NewLeft leftVal = binder.apply(oldSupplier.get()).getLeft(); - - return mapper.apply(leftVal); - }; - - final Supplier rightSupp = () -> { - if(pairBound) return boundPair.getRight(); - - return binder.apply(oldSupplier.get()).getRight(); - }; - - return new LazyPair<>(leftSupp, rightSupp); - } - - @Override - public IPair mapRight(final Function mapper) { - final Supplier leftSupp = () -> { - if(pairBound) return boundPair.getLeft(); - - return binder.apply(oldSupplier.get()).getLeft(); - }; - - final Supplier rightSupp = () -> { - if(pairBound) return mapper.apply(boundPair.getRight()); - - final NewRight rightVal = binder.apply(oldSupplier.get()).getRight(); - - return mapper.apply(rightVal); - }; - - return new LazyPair<>(leftSupp, rightSupp); - } - - @Override - public MergedType merge(final BiFunction merger) { - if(!pairBound) { - boundPair = binder.apply(oldSupplier.get()); - - pairBound = true; - } - - return boundPair.merge(merger); - } -} diff --git a/base/src/main/java/bjc/utils/data/internals/WrappedLazy.java b/base/src/main/java/bjc/utils/data/internals/WrappedLazy.java deleted file mode 100644 index c08e502..0000000 --- a/base/src/main/java/bjc/utils/data/internals/WrappedLazy.java +++ /dev/null @@ -1,83 +0,0 @@ -package bjc.utils.data.internals; - -import java.util.function.Function; -import java.util.function.UnaryOperator; - -import bjc.utils.data.IHolder; -import bjc.utils.data.Lazy; - -/** - * A wrapped lazy value. - * - * @author Ben Culkin - * @param - * The type of the wrapped value. - */ -public class WrappedLazy implements IHolder { - /* Held value. */ - private final IHolder> held; - - /** - * Create a new wrapped lazy value. - * - * @param wrappedHolder - * The holder to make lazy. - */ - public WrappedLazy(final IHolder wrappedHolder) { - held = new Lazy<>(wrappedHolder); - } - - /* - * This has an extra parameter, because otherwise it erases to the same - * as the public one. - * - * This is a case where reified generics would be useful, because then - * the compiler could know which one we meant without the dummy - * parameter. - */ - private WrappedLazy(final IHolder> wrappedHolder, - @SuppressWarnings("unused") final boolean dummy) { - held = wrappedHolder; - } - - @Override - public IHolder bind(final Function> binder) { - final IHolder> newHolder = held.map((containedHolder) -> { - return containedHolder.bind(binder); - }); - - return new WrappedLazy<>(newHolder, false); - } - - @Override - public Function> lift(final Function func) { - return (val) -> { - return new Lazy<>(func.apply(val)); - }; - } - - @Override - public IHolder map(final Function mapper) { - final IHolder> newHolder = held.map((containedHolder) -> { - return containedHolder.map(mapper); - }); - - return new WrappedLazy<>(newHolder, false); - } - - @Override - public IHolder transform(final UnaryOperator transformer) { - held.transform((containedHolder) -> { - return containedHolder.transform(transformer); - }); - - return this; - } - - @Override - public UnwrappedType unwrap(final Function unwrapper) { - return held.unwrap((containedHolder) -> { - return containedHolder.unwrap(unwrapper); - }); - } -} diff --git a/base/src/main/java/bjc/utils/data/internals/WrappedOption.java b/base/src/main/java/bjc/utils/data/internals/WrappedOption.java deleted file mode 100644 index 19d5e26..0000000 --- a/base/src/main/java/bjc/utils/data/internals/WrappedOption.java +++ /dev/null @@ -1,96 +0,0 @@ -package bjc.utils.data.internals; - -import java.util.function.Function; -import java.util.function.UnaryOperator; - -import bjc.utils.data.IHolder; -import bjc.utils.data.Option; - -/** - * A wrapped optional value. - * - * @author Ben Culkin. - * @param - * The wrapped type. - */ -public class WrappedOption implements IHolder { - /* The held value. */ - private final IHolder> held; - - /** - * Create a new wrapped option. - * - * @param seedValue - * The value to wrap. - */ - public WrappedOption(final IHolder seedValue) { - held = new Option<>(seedValue); - } - - /* - * The dummy parameter is to ensure the compiler can pick the right - * method, because without this method erases to the same type as the - * public one. - */ - private WrappedOption(final IHolder> toHold, - @SuppressWarnings("unused") final boolean dummy) { - held = toHold; - } - - @Override - public IHolder bind(final Function> binder) { - final IHolder> newHolder = held.map((containedHolder) -> { - return containedHolder.bind((containedValue) -> { - if(containedValue == null) return new Option<>(null); - - return binder.apply(containedValue); - }); - }); - - return new WrappedOption<>(newHolder, false); - } - - @Override - public Function> lift(final Function func) { - return (val) -> { - return new Option<>(func.apply(val)); - }; - } - - @Override - public IHolder map(final Function mapper) { - final IHolder> newHolder = held.map((containedHolder) -> { - return containedHolder.map((containedValue) -> { - if(containedValue == null) return null; - - return mapper.apply(containedValue); - }); - }); - - return new WrappedOption<>(newHolder, false); - } - - @Override - public IHolder transform(final UnaryOperator transformer) { - held.transform((containedHolder) -> { - return containedHolder.transform((containedValue) -> { - if(containedValue == null) return null; - - return transformer.apply(containedValue); - }); - }); - - return this; - } - - @Override - public UnwrappedType unwrap(final Function unwrapper) { - return held.unwrap((containedHolder) -> { - return containedHolder.unwrap((containedValue) -> { - if(containedValue == null) return null; - - return unwrapper.apply(containedValue); - }); - }); - } -} -- cgit v1.2.3