diff options
Diffstat (limited to 'base/src/main')
52 files changed, 69 insertions, 2891 deletions
diff --git a/base/src/main/java/bjc/utils/cli/GenericCommandMode.java b/base/src/main/java/bjc/utils/cli/GenericCommandMode.java index 03d9feb..79e716f 100644 --- a/base/src/main/java/bjc/utils/cli/GenericCommandMode.java +++ b/base/src/main/java/bjc/utils/cli/GenericCommandMode.java @@ -4,8 +4,8 @@ import java.util.TreeMap; import java.util.function.BiConsumer; import java.util.function.Consumer; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IMap; /** * A general command mode, with a customizable set of commands. diff --git a/base/src/main/java/bjc/utils/cli/objects/DelimSplitterCLI.java b/base/src/main/java/bjc/utils/cli/objects/DelimSplitterCLI.java index 0dbd2a4..27d74c8 100644 --- a/base/src/main/java/bjc/utils/cli/objects/DelimSplitterCLI.java +++ b/base/src/main/java/bjc/utils/cli/objects/DelimSplitterCLI.java @@ -11,8 +11,8 @@ import java.util.Map; import java.util.Scanner; import bjc.data.ITree; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; import bjc.utils.funcutils.StringUtils; import bjc.utils.ioutils.MirrorDB; import bjc.utils.parserutils.delims.DelimiterException; diff --git a/base/src/main/java/bjc/utils/components/FileComponentRepository.java b/base/src/main/java/bjc/utils/components/FileComponentRepository.java index 0ca2b5e..113c6dc 100644 --- a/base/src/main/java/bjc/utils/components/FileComponentRepository.java +++ b/base/src/main/java/bjc/utils/components/FileComponentRepository.java @@ -11,9 +11,9 @@ import java.util.logging.Logger; import bjc.data.IHolder; import bjc.data.Identity; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IList; +import bjc.funcdata.IMap; import bjc.utils.funcutils.FileUtils; /** diff --git a/base/src/main/java/bjc/utils/components/IComponentRepository.java b/base/src/main/java/bjc/utils/components/IComponentRepository.java index 8ecd446..9339a19 100644 --- a/base/src/main/java/bjc/utils/components/IComponentRepository.java +++ b/base/src/main/java/bjc/utils/components/IComponentRepository.java @@ -1,7 +1,7 @@ package bjc.utils.components; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.IList; +import bjc.funcdata.IMap; /** * A collection of implementations of a particular type of diff --git a/base/src/main/java/bjc/utils/components/MemoryComponentRepository.java b/base/src/main/java/bjc/utils/components/MemoryComponentRepository.java index 1dae6e7..22bc55d 100644 --- a/base/src/main/java/bjc/utils/components/MemoryComponentRepository.java +++ b/base/src/main/java/bjc/utils/components/MemoryComponentRepository.java @@ -1,6 +1,6 @@ package bjc.utils.components; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.IMap; /** * A repository of components stored in memory. diff --git a/base/src/main/java/bjc/utils/funcdata/ExtendedMap.java b/base/src/main/java/bjc/utils/funcdata/ExtendedMap.java deleted file mode 100644 index a2ace67..0000000 --- a/base/src/main/java/bjc/utils/funcdata/ExtendedMap.java +++ /dev/null @@ -1,149 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -import bjc.utils.funcutils.ListUtils; - -/** - * An extended version of a map, that stores values into a map, but can look - * into a different one for others. - * - * @author Ben Culkin - * - * @param <KeyType> - * The type of the keys of the map. - * - * @param <ValueType> - * The type of the values of the map. - */ -class ExtendedMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { - /* The map we delegate lookups to. */ - private final IMap<KeyType, ValueType> delegate; - /* The map we store things in. */ - private final IMap<KeyType, ValueType> store; - - /** - * Create a new extended map. - * - * @param delegate - * The map to lookup things in. - * - * @param store - * The map to store things in. - */ - public ExtendedMap(final IMap<KeyType, ValueType> delegate, final IMap<KeyType, ValueType> store) { - this.delegate = delegate; - this.store = store; - } - - @Override - public void clear() { - store.clear(); - } - - @Override - public boolean containsKey(final KeyType key) { - if(store.containsKey(key)) return true; - - return delegate.containsKey(key); - } - - @Override - public IMap<KeyType, ValueType> extend() { - return new ExtendedMap<>(this, new FunctionalMap<>()); - } - - @Override - public void forEach(final BiConsumer<KeyType, ValueType> action) { - store.forEach(action); - - delegate.forEach(action); - } - - @Override - public void forEachKey(final Consumer<KeyType> action) { - store.forEachKey(action); - - delegate.forEachKey(action); - } - - @Override - public void forEachValue(final Consumer<ValueType> action) { - store.forEachValue(action); - - delegate.forEachValue(action); - } - - @Override - public ValueType get(final KeyType key) { - if(store.containsKey(key)) return store.get(key); - - return delegate.get(key); - } - - @Override - public int size() { - return store.size() + delegate.size(); - } - - @Override - public IList<KeyType> keyList() { - return ListUtils.mergeLists(store.keyList(), delegate.keyList()); - } - - @Override - public <MappedValue> IMap<KeyType, MappedValue> transform(final Function<ValueType, MappedValue> transformer) { - return new TransformedValueMap<>(this, transformer); - } - - @Override - public ValueType put(final KeyType key, final ValueType val) { - return store.put(key, val); - } - - @Override - public ValueType remove(final KeyType key) { - if(!store.containsKey(key)) return delegate.remove(key); - - return store.remove(key); - } - - @Override - public IList<ValueType> valueList() { - return ListUtils.mergeLists(store.valueList(), delegate.valueList()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (delegate == null ? 0 : delegate.hashCode()); - result = prime * result + (store == null ? 0 : store.hashCode()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if(this == obj) return true; - if(obj == null) return false; - if(!(obj instanceof ExtendedMap)) return false; - - final ExtendedMap<?, ?> other = (ExtendedMap<?, ?>) obj; - - if(delegate == null) { - if(other.delegate != null) return false; - } else if(!delegate.equals(other.delegate)) return false; - if(store == null) { - if(other.store != null) return false; - } else if(!store.equals(other.store)) return false; - - return true; - } - - @Override - public String toString() { - return String.format("ExtendedMap [delegate=%s, store=%s]", delegate, store); - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/FunctionalList.java b/base/src/main/java/bjc/utils/funcdata/FunctionalList.java deleted file mode 100644 index e955152..0000000 --- a/base/src/main/java/bjc/utils/funcdata/FunctionalList.java +++ /dev/null @@ -1,465 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; - -import bjc.data.IHolder; -import bjc.data.IPair; -import bjc.data.Identity; -import bjc.data.Pair; - -/** - * A wrapper over another list that provides eager functional operations over - * it. - * - * Differs from a stream in every way except for the fact that they both provide - * functional operations. - * - * @author ben - * - * @param <E> - * The type in this list - */ -public class FunctionalList<E> implements Cloneable, IList<E> { - /* The list used as a backing store */ - private final List<E> wrapped; - - /** Create a new empty functional list. */ - public FunctionalList() { - wrapped = new ArrayList<>(); - } - - /** - * Create a new functional list containing the specified items. - * - * Takes O(n) time, where n is the number of items specified - * - * @param items - * The items to put into this functional list. - */ - @SafeVarargs - public FunctionalList(final E... items) { - wrapped = new ArrayList<>(items.length); - - for(final E item : items) { - wrapped.add(item); - } - } - - /** - * Create a new functional list containing the specified items. - * - * Takes O(n) time, where n is the number of items specified - * - * @param items - * The items to put into this functional list. - * @return The returned list. - */ - @SafeVarargs - public static <T> IList<T> listOf(final T... items) { - return new FunctionalList<>(items); - } - /** - * Create a new functional list with the specified size. - * - * @param size - * The size of the backing list . - */ - private FunctionalList(final int size) { - wrapped = new ArrayList<>(size); - } - - /** - * Create a new functional list as a wrapper of a existing list. - * - * Takes O(1) time, since it doesn't copy the list. - * - * @param backing - * The list to use as a backing list. - */ - public FunctionalList(final List<E> backing) { - if(backing == null) throw new NullPointerException("Backing list must be non-null"); - - wrapped = backing; - } - - @Override - public boolean add(final E item) { - return wrapped.add(item); - } - - @Override - public boolean allMatch(final Predicate<E> predicate) { - if(predicate == null) throw new NullPointerException("Predicate must be non-null"); - - for(final E item : wrapped) { - if(!predicate.test(item)) - /* We've found a non-matching item. */ - return false; - } - - /* All of the items matched. */ - return true; - } - - @Override - public boolean anyMatch(final Predicate<E> predicate) { - if(predicate == null) throw new NullPointerException("Predicate must be not null"); - - for(final E item : wrapped) { - if(predicate.test(item)) - /* We've found a matching item. */ - return true; - } - - /* We didn't find a matching item. */ - return false; - } - - /** - * Clone this list into a new one, and clone the backing list as well. - * - * Takes O(n) time, where n is the number of elements in the list. - * - * @return A copy of the list. - */ - @Override - public IList<E> clone() { - final IList<E> cloned = new FunctionalList<>(); - - for(final E element : wrapped) { - cloned.add(element); - } - - return cloned; - } - - @Override - public <T, F> IList<F> combineWith(final IList<T> rightList, final BiFunction<E, T, F> itemCombiner) { - if(rightList == null) { - throw new NullPointerException("Target combine list must not be null"); - } else if(itemCombiner == null) { - throw new NullPointerException("Combiner must not be null"); - } - - final IList<F> returned = new FunctionalList<>(); - - /* Get the iterator for the other list. */ - final Iterator<T> rightIterator = rightList.toIterable().iterator(); - - for(final Iterator<E> leftIterator = wrapped.iterator(); leftIterator.hasNext() - && rightIterator.hasNext();) { - /* Add the transformed items to the result list. */ - final E leftVal = leftIterator.next(); - final T rightVal = rightIterator.next(); - - returned.add(itemCombiner.apply(leftVal, rightVal)); - } - - return returned; - } - - @Override - public boolean contains(final E item) { - /* Check if any items in the list match the provided item. */ - return this.anyMatch(item::equals); - } - - @Override - public E first() { - if(wrapped.size() < 1) throw new NoSuchElementException("Attempted to get first element of empty list"); - - return wrapped.get(0); - } - - @Override - public E last() { - if(wrapped.size() < 1) throw new NoSuchElementException("Attempted to get last element of empty list"); - - return wrapped.get(wrapped.size() - 1); - } - - @Override - public E popFirst() { - if(wrapped.size() < 1) throw new NoSuchElementException("Attempted to pop first element of empty list"); - - E head = first(); - wrapped.remove(0); - - return head; - } - - @Override - public E popLast() { - if(wrapped.size() < 1) throw new NoSuchElementException("Attempted to pop last element of empty list"); - - E tail = last(); - wrapped.remove(wrapped.size() - 1); - - return tail; - } - - @Override - public <T> IList<T> flatMap(final Function<E, IList<T>> expander) { - if(expander == null) throw new NullPointerException("Expander must not be null"); - - final IList<T> returned = new FunctionalList<>(this.wrapped.size()); - - forEach(element -> { - final IList<T> expandedElement = expander.apply(element); - - if(expandedElement == null) throw new NullPointerException("Expander returned null list"); - - /* Add each element to the returned list. */ - expandedElement.forEach(returned::add); - }); - - return returned; - } - - @Override - public void forEach(final Consumer<? super E> action) { - if(action == null) throw new NullPointerException("Action is null"); - - wrapped.forEach(action); - } - - @Override - public void forEachIndexed(final BiConsumer<Integer, E> indexedAction) { - if(indexedAction == null) throw new NullPointerException("Action must not be null"); - - /* - * This is held b/c ref'd variables must be final/effectively - * final. - */ - final IHolder<Integer> currentIndex = new Identity<>(0); - - wrapped.forEach((element) -> { - /* Call the action with the index and the value. */ - indexedAction.accept(currentIndex.unwrap(index -> index), element); - - /* Increment the value. */ - currentIndex.transform((index) -> index + 1); - }); - } - - @Override - public E getByIndex(final int index) { - return wrapped.get(index); - } - - /** - * Get the internal backing list. - * - * @return The backing list this list is based off of. - */ - public List<E> getInternal() { - return wrapped; - } - - @Override - public IList<E> getMatching(final Predicate<E> predicate) { - if(predicate == null) throw new NullPointerException("Predicate must not be null"); - - final IList<E> returned = new FunctionalList<>(); - - wrapped.forEach((element) -> { - if(predicate.test(element)) { - /* - * The item matches, so add it to the returned - * list. - */ - returned.add(element); - } - }); - - return returned; - } - - @Override - public int getSize() { - return wrapped.size(); - } - - @Override - public boolean isEmpty() { - return wrapped.isEmpty(); - } - - /* Check if a partition has room for another item. */ - private Boolean isPartitionFull(final int numberPerPartition, final IHolder<IList<E>> currentPartition) { - return currentPartition.unwrap((partition) -> partition.getSize() >= numberPerPartition); - } - - @Override - public <T> IList<T> map(final Function<E, T> elementTransformer) { - if(elementTransformer == null) throw new NullPointerException("Transformer must be not null"); - - final IList<T> returned = new FunctionalList<>(this.wrapped.size()); - - forEach(element -> { - // Add the transformed item to the result - returned.add(elementTransformer.apply(element)); - }); - - return returned; - } - - @Override - public <T> IList<IPair<E, T>> pairWith(final IList<T> rightList) { - return combineWith(rightList, Pair<E, T>::new); - } - - @Override - public IList<IList<E>> partition(final int numberPerPartition) { - if(numberPerPartition < 1 || numberPerPartition > wrapped.size()) { - final String fmt = "%s is an invalid partition size. Must be between 1 and %d"; - final String msg = String.format(fmt, numberPerPartition, wrapped.size()); - - throw new IllegalArgumentException(msg); - } - - final IList<IList<E>> returned = new FunctionalList<>(); - - /* The current partition being filled. */ - final IHolder<IList<E>> currentPartition = new Identity<>(new FunctionalList<>()); - - this.forEach(element -> { - if(isPartitionFull(numberPerPartition, currentPartition)) { - /* Add the partition to the list. */ - returned.add(currentPartition.unwrap(partition -> partition)); - - /* Start a new partition. */ - currentPartition.transform(partition -> new FunctionalList<>()); - } else { - /* Add the element to the current partition. */ - currentPartition.unwrap(partition -> partition.add(element)); - } - }); - - return returned; - } - - @Override - public void prepend(final E item) { - wrapped.add(0, item); - } - - @Override - public E randItem(final Function<Integer, Integer> rnd) { - if(rnd == null) throw new NullPointerException("Random source must not be null"); - - final int randomIndex = rnd.apply(wrapped.size()); - - return wrapped.get(randomIndex); - } - - @Override - public <T, F> F reduceAux(final T initialValue, final BiFunction<E, T, T> stateAccumulator, - final Function<T, F> resultTransformer) { - if(stateAccumulator == null) { - throw new NullPointerException("Accumulator must not be null"); - } else if(resultTransformer == null) { - throw new NullPointerException("Transformer must not be null"); - } - - /* The current collapsed list. */ - final IHolder<T> currentState = new Identity<>(initialValue); - - wrapped.forEach(element -> { - /* Accumulate a new value into the state. */ - currentState.transform(state -> stateAccumulator.apply(element, state)); - }); - - /* Convert the state to its final value. */ - return currentState.unwrap(resultTransformer); - } - - @Override - public boolean removeIf(final Predicate<E> removePredicate) { - if(removePredicate == null) throw new NullPointerException("Predicate must be non-null"); - - return wrapped.removeIf(removePredicate); - } - - @Override - public void removeMatching(final E desiredElement) { - removeIf(element -> element.equals(desiredElement)); - } - - @Override - public void reverse() { - Collections.reverse(wrapped); - } - - @Override - public E search(final E searchKey, final Comparator<E> comparator) { - /* Search our internal list. */ - final int foundIndex = Collections.binarySearch(wrapped, searchKey, comparator); - - if(foundIndex >= 0) { - /* We found a matching element. */ - return wrapped.get(foundIndex); - } - - /* We didn't find an element. */ - return null; - } - - @Override - public void sort(final Comparator<E> comparator) { - Collections.sort(wrapped, comparator); - } - - @Override - public IList<E> tail() { - return new FunctionalList<>(wrapped.subList(1, getSize())); - } - - @Override - public E[] toArray(final E[] arrType) { - return wrapped.toArray(arrType); - } - - @Override - public Iterable<E> toIterable() { - return wrapped; - } - - @Override - public String toString() { - final int lSize = getSize(); - - if(lSize == 0) return "()"; - - final StringBuilder sb = new StringBuilder("("); - final Iterator<E> itr = toIterable().iterator(); - final E itm = itr.next(); - int i = 0; - - if(lSize == 1) return "(" + itm + ")"; - - for(final E item : toIterable()) { - sb.append(item.toString()); - - if(i < lSize - 1) { - sb.append(", "); - } - - i += 1; - } - - sb.append(")"); - - return sb.toString(); - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/FunctionalMap.java b/base/src/main/java/bjc/utils/funcdata/FunctionalMap.java deleted file mode 100644 index b67db3c..0000000 --- a/base/src/main/java/bjc/utils/funcdata/FunctionalMap.java +++ /dev/null @@ -1,175 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -import bjc.data.IPair; - -/** - * Basic implementation of {@link IMap} - * - * @author ben - * - * @param <KeyType> - * The type of the map's keys. - * - * @param <ValueType> - * The type of the map's values. - */ -public class FunctionalMap<KeyType, ValueType> implements IMap<KeyType, ValueType> { - /* Our backing store. */ - private Map<KeyType, ValueType> wrappedMap; - - /** Create a new blank functional map */ - public FunctionalMap() { - wrappedMap = new HashMap<>(); - } - - /** - * Create a new functional map with the specified entries. - * - * @param entries - * The entries to put into the map. - */ - @SafeVarargs - public FunctionalMap(final IPair<KeyType, ValueType>... entries) { - this(); - - for(final IPair<KeyType, ValueType> entry : entries) { - entry.doWith((key, val) -> { - wrappedMap.put(key, val); - }); - } - } - - /** - * Create a new functional map wrapping the specified map. - * - * @param wrap - * The map to wrap. - */ - public FunctionalMap(final Map<KeyType, ValueType> wrap) { - if(wrap == null) throw new NullPointerException("Map to wrap must not be null"); - - wrappedMap = wrap; - } - - @Override - public void clear() { - wrappedMap.clear(); - } - - @Override - public boolean containsKey(final KeyType key) { - return wrappedMap.containsKey(key); - } - - @Override - public IMap<KeyType, ValueType> extend() { - return new ExtendedMap<>(this, new FunctionalMap<>()); - } - - @Override - public void forEach(final BiConsumer<KeyType, ValueType> action) { - wrappedMap.forEach(action); - } - - @Override - public void forEachKey(final Consumer<KeyType> action) { - wrappedMap.keySet().forEach(action); - } - - @Override - public void forEachValue(final Consumer<ValueType> action) { - wrappedMap.values().forEach(action); - } - - @Override - public ValueType get(final KeyType key) { - if(key == null) throw new NullPointerException("Key must not be null"); - - if(!wrappedMap.containsKey(key)) { - final String msg = String.format("Key %s is not present in the map", key); - - throw new IllegalArgumentException(msg); - } - - return wrappedMap.get(key); - } - - @Override - public int size() { - return wrappedMap.size(); - } - - @Override - public IList<KeyType> keyList() { - final FunctionalList<KeyType> keys = new FunctionalList<>(); - - wrappedMap.keySet().forEach(key -> { - keys.add(key); - }); - - return keys; - } - - @Override - public <MappedValue> IMap<KeyType, MappedValue> transform(final Function<ValueType, MappedValue> transformer) { - if(transformer == null) throw new NullPointerException("Transformer must not be null"); - - return new TransformedValueMap<>(this, transformer); - } - - @Override - public ValueType put(final KeyType key, final ValueType val) { - if(key == null) throw new NullPointerException("Key must not be null"); - - return wrappedMap.put(key, val); - } - - @Override - public ValueType remove(final KeyType key) { - return wrappedMap.remove(key); - } - - @Override - public String toString() { - return wrappedMap.toString(); - } - - @Override - public IList<ValueType> valueList() { - final FunctionalList<ValueType> values = new FunctionalList<>(); - - wrappedMap.values().forEach(value -> { - values.add(value); - }); - - return values; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (wrappedMap == null ? 0 : wrappedMap.hashCode()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if(this == obj) return true; - if(obj == null) return false; - if(!(obj instanceof FunctionalMap)) return false; - - final FunctionalMap<?, ?> other = (FunctionalMap<?, ?>) obj; - - if(wrappedMap == null) { - if(other.wrappedMap != null) return false; - } else if(!wrappedMap.equals(other.wrappedMap)) return false; - return true; - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/FunctionalStringTokenizer.java b/base/src/main/java/bjc/utils/funcdata/FunctionalStringTokenizer.java deleted file mode 100644 index 4935e3d..0000000 --- a/base/src/main/java/bjc/utils/funcdata/FunctionalStringTokenizer.java +++ /dev/null @@ -1,162 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.StringTokenizer; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * A string tokenizer that exposes a functional interface. - * - * @author ben - */ -public class FunctionalStringTokenizer { - /** - * Create a new tokenizer from the specified string. - * - * @param strang - * The string to create a tokenizer from. - * - * @return A new tokenizer that splits the provided string on spaces. - */ - public static FunctionalStringTokenizer fromString(final String strang) { - if(strang == null) throw new NullPointerException("String to tokenize must be non-null"); - - return new FunctionalStringTokenizer(new StringTokenizer(strang, " ")); - } - - /* The string tokenizer being driven */ - private final StringTokenizer input; - - /** - * Create a functional string tokenizer from a given string. - * - * @param inp - * The string to tokenize. - */ - public FunctionalStringTokenizer(final String inp) { - if(inp == null) throw new NullPointerException("String to tokenize must be non-null"); - - this.input = new StringTokenizer(inp); - } - - /** - * Create a functional string tokenizer from a given string and set of - * separators. - * - * @param input - * The string to tokenize. - * - * @param seperators - * The set of separating tokens to use for splitting. - */ - public FunctionalStringTokenizer(final String input, final String seperators) { - if(input == null) { - throw new NullPointerException("String to tokenize must not be null"); - } else if(seperators == null) { - throw new NullPointerException("Tokens to split on must not be null"); - } - - this.input = new StringTokenizer(input, seperators); - } - - /** - * Create a functional string tokenizer from a non-functional one. - * - * @param toWrap - * The non-functional string tokenizer to wrap. - */ - public FunctionalStringTokenizer(final StringTokenizer toWrap) { - if(toWrap == null) throw new NullPointerException("Wrapped tokenizer must not be null"); - - this.input = toWrap; - } - - /** - * Execute a provided action for each of the remaining tokens. - * - * @param action - * The action to execute for each token. - */ - public void forEachToken(final Consumer<String> action) { - if(action == null) throw new NullPointerException("Action must not be null"); - - while(input.hasMoreTokens()) { - action.accept(input.nextToken()); - } - } - - /** - * Get the string tokenizer encapsulated by this tokenizer. - * - * @return The encapsulated tokenizer. - */ - public StringTokenizer getInternal() { - return input; - } - - /** - * Check if this tokenizer has more tokens. - * - * @return Whether or not this tokenizer has more tokens. - */ - public boolean hasMoreTokens() { - return input.hasMoreTokens(); - } - - /** - * Return the next token from the tokenizer. - * - * @return The next token from the tokenizer, or null if no more tokens - * are available. - */ - public String nextToken() { - if(input.hasMoreTokens()) { - /* Return the next available token. */ - return input.nextToken(); - } - - /* Return no token. */ - return null; - } - - /** - * Convert this tokenizer into a list of strings. - * - * @return This tokenizer, converted into a list of strings. - */ - public IList<String> toList() { - return toList((final String element) -> element); - } - - /** - * Convert the contents of this tokenizer into a list. Consumes all of - * the input from this tokenizer. - * - * @param <E> - * The type of the converted tokens. - * - * @param transformer - * The function to use to convert tokens. - * - * @return A list containing all of the converted tokens. - */ - public <E> IList<E> toList(final Function<String, E> transformer) { - if(transformer == null) throw new NullPointerException("Transformer must not be null"); - - final IList<E> returned = new FunctionalList<>(); - - /* Add each token to the list after transforming it. */ - forEachToken(token -> { - final E transformedToken = transformer.apply(token); - - returned.add(transformedToken); - }); - - return returned; - } - - @Override - public String toString() { - return String.format("FunctionalStringTokenizer [input=%s]", input); - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/IList.java b/base/src/main/java/bjc/utils/funcdata/IList.java deleted file mode 100644 index 5ea7678..0000000 --- a/base/src/main/java/bjc/utils/funcdata/IList.java +++ /dev/null @@ -1,463 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.Comparator; -import java.util.Iterator; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collector; - -import bjc.data.IPair; -import bjc.utils.functypes.ID; - -/** - * A wrapper over another list that provides functional operations over it. - * - * @author ben - * - * @param <ContainedType> - * The type in this list - */ -public interface IList<ContainedType> extends Iterable<ContainedType> { - /** - * Add an item to this list. - * - * @param item - * The item to add to this list. - * - * @return Whether the item was added to the list successfully.. - */ - boolean add(ContainedType item); - - /** - * Add all of the elements in the provided list to this list. - * - * @param items - * The list of items to add. - * - * @return True if every item was successfully added to the list, false - * otherwise. - */ - default boolean addAll(final IList<ContainedType> items) { - return items.map(this::add).anyMatch(bl -> bl == false); - } - - /** - * Add all of the elements in the provided array to this list. - * - * @param items - * The array of items to add. - * - * @return True if every item was successfully added to the list, false - * otherwise. - */ - @SuppressWarnings("unchecked") - default boolean addAll(final ContainedType... items) { - boolean succ = true; - - for (final ContainedType item : items) { - final boolean addSucc = add(item); - - succ = succ ? addSucc : false; - } - - return succ; - } - - /** - * Check if all of the elements of this list match the specified - * predicate. - * - * @param matcher - * The predicate to use for checking. - * - * @return Whether all of the elements of the list match the specified - * predicate. - */ - boolean allMatch(Predicate<ContainedType> matcher); - - /** - * Check if any of the elements in this list match the specified list. - * - * @param matcher - * The predicate to use for checking. - * - * @return Whether any element in the list matches the provided - * predicate. - */ - boolean anyMatch(Predicate<ContainedType> matcher); - - /** - * Reduce the contents of this list using a collector. - * - * @param <StateType> - * The intermediate accumulation type. - * - * @param <ReducedType> - * The final, reduced type. - * - * @param collector - * The collector to use for reduction. - * - * @return The reduced list. - */ - default <StateType, ReducedType> ReducedType collect( - final Collector<ContainedType, StateType, ReducedType> collector) { - final BiConsumer<StateType, ContainedType> accumulator = collector.accumulator(); - - final StateType initial = collector.supplier().get(); - return reduceAux(initial, (value, state) -> { - accumulator.accept(state, value); - - return state; - }, collector.finisher()); - } - - /** - * Combine this list with another one into a new list and merge the - * results. - * - * Works sort of like a combined zip/map over resulting pairs. Does not - * change the underlying list. - * - * NOTE: The returned list will have the length of the shorter of this - * list and the combined one. - * - * @param <OtherType> - * The type of the second list. - * - * @param <CombinedType> - * The type of the combined list. - * - * @param list - * The list to combine with. - * - * @param combiner - * The function to use for combining element pairs. - * - * @return A new list containing the merged pairs of lists. - */ - <OtherType, CombinedType> IList<CombinedType> combineWith(IList<OtherType> list, - BiFunction<ContainedType, OtherType, CombinedType> combiner); - - /** - * Check if the list contains the specified item. - * - * @param item - * The item to see if it is contained. - * - * @return Whether or not the specified item is in the list. - */ - boolean contains(ContainedType item); - - /** - * Get the first element in the list. - * - * @return The first element in this list. - */ - ContainedType first(); - - /** - * Get the last element in the list. - * - * @return The last element in this list. - */ - ContainedType last(); - - /** - * Remove and return the first element from the list. - * - * @return The first element from the list. - */ - ContainedType popFirst(); - - /** - * Remove and return the last element from the list. - * - * @return The last element from the list. - */ - ContainedType popLast(); - - /** - * Apply a function to each member of the list, then flatten the - * results. - * - * Does not change the underlying list. - * - * @param <MappedType> - * The type of the flattened list. - * - * @param expander - * The function to apply to each member of the list. - * - * @return A new list containing the flattened results of applying the - * provided function. - */ - <MappedType> IList<MappedType> flatMap(Function<ContainedType, IList<MappedType>> expander); - - /** - * Apply a given action for each member of the list. - * - * @param action - * The action to apply to each member of the list. - */ - @Override - void forEach(Consumer<? super ContainedType> action); - - /** - * Apply a given function to each element in the list and its index. - * - * @param action - * The function to apply to each element in the list and - * its index. - */ - void forEachIndexed(BiConsumer<Integer, ContainedType> action); - - /** - * Retrieve a value in the list by its index. - * - * @param index - * The index to retrieve a value from. - * - * @return The value at the specified index in the list. - */ - ContainedType getByIndex(int index); - - /** - * Retrieve a list containing all elements matching a predicate. - * - * @param predicate - * The predicate to match by. - * - * @return A list containing all elements that match the predicate. - */ - IList<ContainedType> getMatching(Predicate<ContainedType> predicate); - - /** - * Retrieve the size of the wrapped list. - * - * @return The size of the wrapped list. - */ - int getSize(); - - /** - * Check if this list is empty. - * - * @return Whether or not this list is empty. - */ - boolean isEmpty(); - - /** - * Create a new list by applying the given function to each element in - * the list. - * - * Does not change the underlying list. - * - * @param <MappedType> - * The type of the transformed list. - * - * @param transformer - * The function to apply to each element in the list. - * - * @return A new list containing the mapped elements of this list. - */ - <MappedType> IList<MappedType> map(Function<ContainedType, MappedType> transformer); - - /** - * Zip two lists into a list of pairs. - * - * @param <OtherType> - * The type of the second list. - * - * @param list - * The list to use as the left side of the pair. - * - * @return A list containing pairs of this element and the specified - * list. - */ - <OtherType> IList<IPair<ContainedType, OtherType>> pairWith(IList<OtherType> list); - - /** - * Partition this list into a list of sublists. - * - * @param partitionSize - * The size of elements to put into each one of the - * sublists. - * - * @return A list partitioned into partitions of size partitionSize. The - * last partition may not be completely full if the size of the - * list is not a multiple of partitionSize. - */ - IList<IList<ContainedType>> partition(int partitionSize); - - /** - * Prepend an item to the list. - * - * @param item - * The item to prepend to the list. - */ - void prepend(ContainedType item); - - /** - * Prepend an array of items to the list. - * - * @param items - * The items to prepend to the list. - */ - @SuppressWarnings("unchecked") - default void prependAll(final ContainedType... items) { - for (final ContainedType item : items) { - prepend(item); - } - } - - /** - * Select a random item from the list, using a default random number - * generator. - * - * @return A random item from the list - */ - default ContainedType randItem() { - return randItem(num -> (int) (Math.random() * num)); - } - - /** - * Select a random item from this list, using the provided random number - * generator. - * - * @param rnd - * The random number generator to use. - * - * @return A random element from this list. - */ - ContainedType randItem(Function<Integer, Integer> rnd); - - /** - * Reduce this list to a single value, using a accumulative approach. - * - * @param <StateType> - * The in-between type of the values - * - * @param <ReducedType> - * The final value type - * - * @param initial - * The initial value of the accumulative state. - * - * @param accumulator - * The function to use to combine a list element with the - * accumulative state. - * - * @param transformer - * The function to use to convert the accumulative state - * into a final result. - * - * @return A single value condensed from this list and transformed into - * its final state. - */ - <StateType, ReducedType> ReducedType reduceAux(StateType initial, - BiFunction<ContainedType, StateType, StateType> accumulator, - Function<StateType, ReducedType> transformer); - - /** - * Reduce this list to a single value, using a accumulative approach. - * - * @param <StateType> - * The in-between type of the values. - * - * @param initial - * The initial value of the accumulative state. - * - * @param accumulator - * The function to use to combine a list element with the - * accumulative state. - * - * @return A single value condensed from this list. - */ - default <StateType> StateType reduceAux(StateType initial, - BiFunction<ContainedType, StateType, StateType> accumulator) { - return reduceAux(initial, accumulator, ID.id()); - } - - /** - * Remove all elements that match a given predicate. - * - * @param predicate - * The predicate to use to determine elements to delete. - * - * @return Whether there was anything that satisfied the predicate. - */ - boolean removeIf(Predicate<ContainedType> predicate); - - /** - * Remove all parameters that match a given parameter. - * - * @param element - * The object to remove all matching copies of. - */ - void removeMatching(ContainedType element); - - /** Reverse the contents of this list in place. */ - void reverse(); - - /** - * Perform a binary search for the specified key using the provided - * means of comparing elements. - * - * Since this IS a binary search, the list must have been sorted before - * hand. - * - * @param key - * The key to search for. - * - * @param comparator - * The way to compare elements for searching. Pass null - * to use the natural ordering for E. - * - * @return The element if it is in this list, or null if it is not. - */ - ContainedType search(ContainedType key, Comparator<ContainedType> comparator); - - /** - * Sort the elements of this list using the provided way of comparing - * elements. - * - * Does change the underlying list. - * - * @param comparator - * The way to compare elements for sorting. Pass null to - * use E's natural ordering - */ - void sort(Comparator<ContainedType> comparator); - - /** - * Get the tail of this list (the list without the first element). - * - * @return The list without the first element. - */ - IList<ContainedType> tail(); - - /** - * Convert this list into an array. - * - * @param type - * The type of array to return. - * - * @return The list, as an array. - */ - ContainedType[] toArray(ContainedType[] type); - - /** - * Convert the list into a Iterable. - * - * @return An iterable view onto the list. - */ - Iterable<ContainedType> toIterable(); - - @Override - default Iterator<ContainedType> iterator() { - return toIterable().iterator(); - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/IMap.java b/base/src/main/java/bjc/utils/funcdata/IMap.java deleted file mode 100644 index 848ec1c..0000000 --- a/base/src/main/java/bjc/utils/funcdata/IMap.java +++ /dev/null @@ -1,190 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * Functional wrapper over map providing some useful things. - * - * @author ben - * - * @param <KeyType> - * The type of this map's keys. - * - * @param <ValueType> - * The type of this map's values. - */ -public interface IMap<KeyType, ValueType> { - /** - * Execute an action for each entry in the map. - * - * @param action - * The action to execute for each entry in the map. - */ - void forEach(BiConsumer<KeyType, ValueType> action); - - /** - * Perform an action for each key in the map. - * - * @param action - * The action to perform on each key in the map. - */ - default void forEachKey(final Consumer<KeyType> action) { - forEach((key, val) -> action.accept(key)); - } - - /** - * Perform an action for each value in the map. - * - * @param action - * The action to perform on each value in the map. - */ - default void forEachValue(final Consumer<ValueType> action) { - forEach((key, val) -> action.accept(val)); - } - - /** - * Check if this map contains the specified key. - * - * @param key - * The key to check. - * - * @return Whether or not the map contains the key. - */ - boolean containsKey(KeyType key); - - /** - * Get the value assigned to the given key. - * - * @param key - * The key to look for a value under. - * - * @return The value of the key. - */ - ValueType get(KeyType key); - - /** - * Get a value from the map, and return a default value if the key - * doesn't exist. - * - * @param key - * The key to attempt to retrieve. - * - * @param defaultValue - * The value to return if the key doesn't exist. - * - * @return The value associated with the key, or the default value if - * the key doesn't exist. - */ - default ValueType getOrDefault(final KeyType key, final ValueType defaultValue) { - try { - return get(key); - } catch(final IllegalArgumentException iaex) { - /* - * We don't care about this, because it indicates a key - * is missing. - */ - return defaultValue; - } - } - - /** - * Add an entry to the map. - * - * @param key - * The key to put the value under. - * - * @param val - * The value to add. - * - * @return The previous value of the key in the map, or null if the key - * wasn't in the map. However, note that it may also return null - * if the key was set to null. - * - * @throws UnsupportedOperationException - * If the map implementation doesn't support modifying the map. - */ - ValueType put(KeyType key, ValueType val); - - /** Delete all the values in the map. */ - default void clear() { - keyList().forEach(key -> remove(key)); - } - - /** - * Get the number of entries in this map. - * - * @return The number of entries in this map. - */ - default int size() { - return keyList().getSize(); - } - - /* - * @NOTE Do we want this to be the semantics for transform, or do we - * want to go to semantics using something like Isomorphism, or doing a - * one-time bulk conversion of the values? - */ - /** - * Transform the values returned by this map. - * - * NOTE: This transform is applied once for each lookup of a value, so - * the transform passed should be a proper function, or things will - * likely not work as expected. - * - * @param <V2> - * The new type of returned values. - * - * @param transformer - * The function to use to transform values. - * - * @return The map where each value will be transformed after lookup. - */ - default <V2> IMap<KeyType, V2> transform(final Function<ValueType, V2> transformer) { - return new TransformedValueMap<>(this, transformer); - } - - /** - * Extends this map, creating a new map that will delegate queries to - * the map, but store any added values itself. - * - * @return An extended map. - */ - IMap<KeyType, ValueType> extend(); - - /** - * Remove the value bound to the key. - * - * @param key - * The key to remove from the map. - * - * @return The previous value for the key in the map, or null if the key - * wasn't in the class. NOTE: Just because you received null, - * doesn't mean the map wasn't changed. It may mean that someone - * put a null value for that key into the map. - */ - ValueType remove(KeyType key); - - /** - * Get a list of all the keys in this map. - * - * @return A list of all the keys in this map. - */ - IList<KeyType> keyList(); - - /** - * Get a list of the values in this map. - * - * @return A list of values in this map. - */ - default IList<ValueType> valueList() { - final IList<ValueType> returns = new FunctionalList<>(); - - for(final KeyType key : keyList()) { - returns.add(get(key)); - } - - return returns; - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/SentryList.java b/base/src/main/java/bjc/utils/funcdata/SentryList.java deleted file mode 100644 index a6a960a..0000000 --- a/base/src/main/java/bjc/utils/funcdata/SentryList.java +++ /dev/null @@ -1,39 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.List; - -/** - * A list that logs when items are inserted into it. - * - * @author bjculkin - * - * @param <T> - * The type of item in the list. - */ -public class SentryList<T> extends FunctionalList<T> { - /** Create a new sentry list. */ - public SentryList() { - super(); - } - - /** - * Create a new sentry list backed by an existing list. - * - * @param backing - * The backing list. - */ - public SentryList(final List<T> backing) { - super(backing); - } - - @Override - public boolean add(final T item) { - final boolean val = super.add(item); - - if(val) { - System.out.println("Added item (" + item + ") to list"); - } - - return val; - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/TransformedValueMap.java b/base/src/main/java/bjc/utils/funcdata/TransformedValueMap.java deleted file mode 100644 index d6d85dd..0000000 --- a/base/src/main/java/bjc/utils/funcdata/TransformedValueMap.java +++ /dev/null @@ -1,116 +0,0 @@ -package bjc.utils.funcdata; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * A map that transforms values from one type to another - * - * @author ben - * - * @param <OldKey> - * The type of the map's keys - * - * @param <OldValue> - * The type of the map's values - * - * @param <NewValue> - * The type of the transformed values - * - */ -final class TransformedValueMap<OldKey, OldValue, NewValue> implements IMap<OldKey, NewValue> { - /* Our backing map. */ - private final IMap<OldKey, OldValue> backing; - /* Our transforming function. */ - private final Function<OldValue, NewValue> transformer; - - /** - * Create a new transformed-value loop. - * - * @param backingMap - * The map to use as backing. - * - * @param transform - * The function to use for the transform. - */ - public TransformedValueMap(final IMap<OldKey, OldValue> backingMap, - final Function<OldValue, NewValue> transform) { - backing = backingMap; - transformer = transform; - } - - @Override - public void clear() { - backing.clear(); - } - - @Override - public boolean containsKey(final OldKey key) { - return backing.containsKey(key); - } - - @Override - public IMap<OldKey, NewValue> extend() { - return new ExtendedMap<>(this, new FunctionalMap<>()); - } - - @Override - public void forEach(final BiConsumer<OldKey, NewValue> action) { - backing.forEach((key, value) -> { - action.accept(key, transformer.apply(value)); - }); - } - - @Override - public void forEachKey(final Consumer<OldKey> action) { - backing.forEachKey(action); - } - - @Override - public void forEachValue(final Consumer<NewValue> action) { - backing.forEachValue(value -> { - action.accept(transformer.apply(value)); - }); - } - - @Override - public NewValue get(final OldKey key) { - return transformer.apply(backing.get(key)); - } - - @Override - public int size() { - return backing.size(); - } - - @Override - public IList<OldKey> keyList() { - return backing.keyList(); - } - - @Override - public <MappedValue> IMap<OldKey, MappedValue> transform(final Function<NewValue, MappedValue> transform) { - return new TransformedValueMap<>(this, transform); - } - - @Override - public NewValue put(final OldKey key, final NewValue value) { - throw new UnsupportedOperationException("Can't add items to transformed map"); - } - - @Override - public NewValue remove(final OldKey key) { - return transformer.apply(backing.remove(key)); - } - - @Override - public String toString() { - return backing.toString(); - } - - @Override - public IList<NewValue> valueList() { - return backing.valueList().map(transformer); - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTree.java b/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTree.java deleted file mode 100644 index 6631834..0000000 --- a/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTree.java +++ /dev/null @@ -1,224 +0,0 @@ -package bjc.utils.funcdata.bst; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.function.Predicate; - -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; - -/** - * A binary search tree, with some mild support for functional traversal. - * - * @author ben - * - * @param <T> - * The data type stored in the node. - */ -public class BinarySearchTree<T> { - /* The comparator for use in ordering items */ - private final Comparator<T> comparator; - - /* The current count of elements in the tree */ - private int elementCount; - - /* The root element of the tree */ - private ITreePart<T> root; - - /** - * Create a new tree using the specified way to compare elements. - * - * @param cmp - * The thing to use for comparing elements - */ - public BinarySearchTree(final Comparator<T> cmp) { - if(cmp == null) throw new NullPointerException("Comparator must not be null"); - - elementCount = 0; - comparator = cmp; - } - - /** - * Add a node to the binary search tree. - * - * @param element - * The data to add to the binary search tree. - */ - public void addNode(final T element) { - elementCount++; - - if(root == null) { - root = new BinarySearchTreeNode<>(element, null, null); - } else { - root.add(element, comparator); - } - } - - /** - * Check if an adjusted pivot falls with the bounds of a list. - * - * @param elements - * The list to get bounds from. - * - * @param pivot - * The pivot. - * - * @param pivotAdjustment - * The distance from the pivot. - * - * @return Whether the adjusted pivot is with the list. - */ - private boolean adjustedPivotInBounds(final IList<T> elements, final int pivot, final int pivotAdjustment) { - return ((pivot - pivotAdjustment) >= 0) && ((pivot + pivotAdjustment) < elements.getSize()); - } - - /** - * Balance the tree, and remove soft-deleted nodes for free. - * - * Takes O(N) time, but also O(N) space. - */ - public void balance() { - final IList<T> elements = new FunctionalList<>(); - - /* Add each element to the list in sorted order. */ - root.forEach(TreeLinearizationMethod.INORDER, element -> elements.add(element)); - - /* Clear the tree. */ - root = null; - - /* Set up the pivot and adjustment for readding elements. */ - final int pivot = elements.getSize() / 2; - int pivotAdjustment = 0; - - /* Add elements until there aren't any left. */ - while(adjustedPivotInBounds(elements, pivot, pivotAdjustment)) { - if(root == null) { - /* Create a new root element. */ - root = new BinarySearchTreeNode<>(elements.getByIndex(pivot), null, null); - } else { - /* - * Add the left and right elements in a balanced - * manner. - */ - root.add(elements.getByIndex(pivot + pivotAdjustment), comparator); - root.add(elements.getByIndex(pivot - pivotAdjustment), comparator); - } - - /* Increase the distance from the pivot. */ - pivotAdjustment++; - } - - /* Add any trailing unbalanced elements. */ - if(pivot - pivotAdjustment >= 0) { - root.add(elements.getByIndex(pivot - pivotAdjustment), comparator); - } else if(pivot + pivotAdjustment < elements.getSize()) { - root.add(elements.getByIndex(pivot + pivotAdjustment), comparator); - } - } - - /** - * Soft-delete a node from the tree. - * - * Soft-deleted nodes stay in the tree until trim()/balance() is - * invoked, and are not included in traversals/finds. - * - * @param element - * The node to delete - */ - public void deleteNode(final T element) { - elementCount--; - - root.delete(element, comparator); - } - - /** - * Get the root of the tree. - * - * @return The root of the tree. - */ - public ITreePart<T> getRoot() { - return root; - } - - /** - * Check if a node is in the tree. - * - * @param element - * The node to check the presence of for the tree.. - * - * @return Whether or not the node is in the tree. - */ - public boolean isInTree(final T element) { - return root.contains(element, comparator); - } - - /** - * Traverse the tree in a specified way until the function fails. - * - * @param linearizationMethod - * The way to linearize the tree for traversal. - * - * @param traversalPredicate - * The function to use until it fails. - */ - public void traverse(final TreeLinearizationMethod linearizationMethod, final Predicate<T> traversalPredicate) { - if(linearizationMethod == null) { - throw new NullPointerException("Linearization method must not be null"); - } else if(traversalPredicate == null) { - throw new NullPointerException("Predicate must not be nulls"); - } - - root.forEach(linearizationMethod, traversalPredicate); - } - - /** Remove all soft-deleted nodes from the tree. */ - public void trim() { - final List<T> nodes = new ArrayList<>(elementCount); - - /* - * Add all non-soft deleted nodes to the tree in insertion - * order. - */ - traverse(TreeLinearizationMethod.PREORDER, node -> { - nodes.add(node); - return true; - }); - - /* Clear the tree. */ - root = null; - - /* Add the nodes to the tree in the order they were inserted. */ - nodes.forEach(node -> addNode(node)); - } - - @Override - public String toString() { - return String.format("BinarySearchTree [elementCount=%s, root='%s']", elementCount, root); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + elementCount; - result = prime * result + (root == null ? 0 : root.hashCode()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if(this == obj) return true; - if(obj == null) return false; - if(!(obj instanceof BinarySearchTree<?>)) return false; - - final BinarySearchTree<?> other = (BinarySearchTree<?>) obj; - - if(elementCount != other.elementCount) return false; - if(root == null) { - if(other.root != null) return false; - } else if(!root.equals(other.root)) return false; - - return true; - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTreeLeaf.java b/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTreeLeaf.java deleted file mode 100644 index 762288f..0000000 --- a/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTreeLeaf.java +++ /dev/null @@ -1,115 +0,0 @@ -package bjc.utils.funcdata.bst; - -import java.util.Comparator; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * A leaf in a tree. - * - * @author ben - * - * @param <T> - * The data stored in the tree. - */ -public class BinarySearchTreeLeaf<T> implements ITreePart<T> { - /** The data held in this tree leaf */ - protected T data; - - /** Whether this node is soft-deleted or not */ - protected boolean isDeleted; - - /** - * Create a new leaf holding the specified data. - * - * @param element - * The data for the leaf to hold. - */ - public BinarySearchTreeLeaf(final T element) { - data = element; - } - - @Override - public void add(final T element, final Comparator<T> comparator) { - throw new IllegalArgumentException("Can't add to a leaf."); - } - - @Override - public <E> E collapse(final Function<T, E> leafTransformer, final BiFunction<E, E, E> branchCollapser) { - if(leafTransformer == null) throw new NullPointerException("Transformer must not be null"); - - return leafTransformer.apply(data); - } - - @Override - public boolean contains(final T element, final Comparator<T> comparator) { - return this.data.equals(element); - } - - @Override - public T data() { - return data; - } - - @Override - public void delete(final T element, final Comparator<T> comparator) { - if(data.equals(element)) { - isDeleted = true; - } - } - - @Override - public boolean directedWalk(final DirectedWalkFunction<T> treeWalker) { - if(treeWalker == null) throw new NullPointerException("Tree walker must not be null"); - - switch(treeWalker.walk(data)) { - case SUCCESS: - return true; - /* We don't have any children to care about. */ - case FAILURE: - case LEFT: - case RIGHT: - default: - return false; - } - } - - @Override - public boolean forEach(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - if(traversalPredicate == null) throw new NullPointerException("Predicate must not be null"); - - return traversalPredicate.test(data); - } - - @Override - public String toString() { - return String.format("BinarySearchTreeLeaf [data='%s', isDeleted=%s]", data, isDeleted); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (data == null ? 0 : data.hashCode()); - result = prime * result + (isDeleted ? 1231 : 1237); - return result; - } - - @Override - public boolean equals(final Object obj) { - if(this == obj) return true; - if(obj == null) return false; - if(!(obj instanceof BinarySearchTreeLeaf<?>)) return false; - - final BinarySearchTreeLeaf<?> other = (BinarySearchTreeLeaf<?>) obj; - - if(data == null) { - if(other.data != null) return false; - } else if(!data.equals(other.data)) return false; - if(isDeleted != other.isDeleted) return false; - - return true; - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTreeNode.java b/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTreeNode.java deleted file mode 100644 index eb7b6b5..0000000 --- a/base/src/main/java/bjc/utils/funcdata/bst/BinarySearchTreeNode.java +++ /dev/null @@ -1,295 +0,0 @@ -package bjc.utils.funcdata.bst; - -import static bjc.utils.funcdata.bst.DirectedWalkFunction.DirectedWalkResult.FAILURE; -import static bjc.utils.funcdata.bst.DirectedWalkFunction.DirectedWalkResult.LEFT; -import static bjc.utils.funcdata.bst.DirectedWalkFunction.DirectedWalkResult.RIGHT; -import static bjc.utils.funcdata.bst.DirectedWalkFunction.DirectedWalkResult.SUCCESS; - -import java.util.Comparator; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * A binary node in a tree. - * - * @author ben - * - * @param <T> - * The data type stored in the tree. - */ -public class BinarySearchTreeNode<T> extends BinarySearchTreeLeaf<T> { - /* The left child of this node */ - private ITreePart<T> left; - - /* The right child of this node */ - private ITreePart<T> right; - - /** - * Create a new node with the specified data and children. - * - * @param element - * The data to store in this node. - * - * @param lft - * The left child of this node. - * - * @param rght - * The right child of this node. - */ - public BinarySearchTreeNode(final T element, final ITreePart<T> lft, final ITreePart<T> rght) { - super(element); - this.left = lft; - this.right = rght; - } - - @Override - public void add(final T element, final Comparator<T> comparator) { - if(comparator == null) throw new NullPointerException("Comparator must not be null"); - - switch(comparator.compare(data, element)) { - case -1: - if(left == null) { - left = new BinarySearchTreeNode<>(element, null, null); - } else { - left.add(element, comparator); - } - break; - case 0: - if(isDeleted) { - isDeleted = false; - } else - throw new IllegalArgumentException("Can't add duplicate values"); - break; - case 1: - if(right == null) { - right = new BinarySearchTreeNode<>(element, null, null); - } else { - right.add(element, comparator); - } - break; - default: - throw new IllegalStateException("Error: Comparator yielded invalid value"); - } - } - - @Override - public <E> E collapse(final Function<T, E> nodeCollapser, final BiFunction<E, E, E> branchCollapser) { - if(nodeCollapser == null || branchCollapser == null) - throw new NullPointerException("Collapser must not be null"); - - final E collapsedNode = nodeCollapser.apply(data); - - if(left != null) { - final E collapsedLeftBranch = left.collapse(nodeCollapser, branchCollapser); - - if(right != null) { - final E collapsedRightBranch = right.collapse(nodeCollapser, branchCollapser); - - final E collapsedBranches = branchCollapser.apply(collapsedLeftBranch, - collapsedRightBranch); - - return branchCollapser.apply(collapsedNode, collapsedBranches); - } - - return branchCollapser.apply(collapsedNode, collapsedLeftBranch); - } - - if(right != null) { - final E collapsedRightBranch = right.collapse(nodeCollapser, branchCollapser); - - return branchCollapser.apply(collapsedNode, collapsedRightBranch); - } - - return collapsedNode; - } - - @Override - public boolean contains(final T element, final Comparator<T> comparator) { - if(comparator == null) throw new NullPointerException("Comparator must not be null"); - - return directedWalk(currentElement -> { - switch(comparator.compare(element, currentElement)) { - case -1: - return LEFT; - case 0: - return isDeleted ? FAILURE : SUCCESS; - case 1: - return RIGHT; - default: - return FAILURE; - } - }); - } - - @Override - public void delete(final T element, final Comparator<T> comparator) { - if(comparator == null) throw new NullPointerException("Comparator must not be null"); - - directedWalk(currentElement -> { - switch(comparator.compare(data, element)) { - case -1: - return left == null ? FAILURE : LEFT; - case 0: - isDeleted = true; - return FAILURE; - case 1: - return right == null ? FAILURE : RIGHT; - default: - return FAILURE; - } - }); - } - - @Override - public boolean directedWalk(final DirectedWalkFunction<T> treeWalker) { - if(treeWalker == null) throw new NullPointerException("Walker must not be null"); - - switch(treeWalker.walk(data)) { - case SUCCESS: - return true; - case LEFT: - return left.directedWalk(treeWalker); - case RIGHT: - return right.directedWalk(treeWalker); - case FAILURE: - default: - return false; - } - } - - @Override - public boolean forEach(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - if(linearizationMethod == null) { - throw new NullPointerException("Linearization method must not be null"); - } else if(traversalPredicate == null) { - throw new NullPointerException("Predicate must not be null"); - } - - switch(linearizationMethod) { - case PREORDER: - return preorderTraverse(linearizationMethod, traversalPredicate); - case INORDER: - return inorderTraverse(linearizationMethod, traversalPredicate); - case POSTORDER: - return postorderTraverse(linearizationMethod, traversalPredicate); - default: - String msg = String.format("Passed an incorrect TreeLinearizationMethod %s. WAT", - linearizationMethod); - - throw new IllegalArgumentException(msg); - } - } - - /* Do an in-order traversal. */ - private boolean inorderTraverse(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - if(!traverseLeftBranch(linearizationMethod, traversalPredicate)) return false; - - if(!traverseElement(traversalPredicate)) return false; - - if(!traverseRightBranch(linearizationMethod, traversalPredicate)) return false; - - return true; - } - - /* Do a post-order traversal. */ - private boolean postorderTraverse(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - if(!traverseLeftBranch(linearizationMethod, traversalPredicate)) return false; - - if(!traverseRightBranch(linearizationMethod, traversalPredicate)) return false; - - if(!traverseElement(traversalPredicate)) return false; - - return true; - - } - - /* Do a pre-order traversal. */ - private boolean preorderTraverse(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - if(!traverseElement(traversalPredicate)) return false; - - if(!traverseLeftBranch(linearizationMethod, traversalPredicate)) return false; - - if(!traverseRightBranch(linearizationMethod, traversalPredicate)) return false; - - return true; - } - - /* Traverse an element. */ - private boolean traverseElement(final Predicate<T> traversalPredicate) { - boolean nodeSuccesfullyTraversed; - - if(isDeleted) { - nodeSuccesfullyTraversed = true; - } else { - nodeSuccesfullyTraversed = traversalPredicate.test(data); - } - - return nodeSuccesfullyTraversed; - } - - /* Traverse the left branch of a tree. */ - private boolean traverseLeftBranch(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - boolean leftSuccesfullyTraversed; - - if(left == null) { - leftSuccesfullyTraversed = true; - } else { - leftSuccesfullyTraversed = left.forEach(linearizationMethod, traversalPredicate); - } - - return leftSuccesfullyTraversed; - } - - /* Traverse the right branch of a tree. */ - private boolean traverseRightBranch(final TreeLinearizationMethod linearizationMethod, - final Predicate<T> traversalPredicate) { - boolean rightSuccesfullyTraversed; - - if(right == null) { - rightSuccesfullyTraversed = true; - } else { - rightSuccesfullyTraversed = right.forEach(linearizationMethod, traversalPredicate); - } - - return rightSuccesfullyTraversed; - } - - @Override - public String toString() { - return String.format("BinarySearchTreeNode [left='%s', right='%s']", left, right); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + (left == null ? 0 : left.hashCode()); - result = prime * result + (right == null ? 0 : right.hashCode()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if(this == obj) return true; - if(!super.equals(obj)) return false; - if(!(obj instanceof BinarySearchTreeNode<?>)) return false; - - final BinarySearchTreeNode<?> other = (BinarySearchTreeNode<?>) obj; - - if(left == null) { - if(other.left != null) return false; - } else if(!left.equals(other.left)) return false; - - if(right == null) { - if(other.right != null) return false; - } else if(!right.equals(other.right)) return false; - - return true; - } -} diff --git a/base/src/main/java/bjc/utils/funcdata/bst/DirectedWalkFunction.java b/base/src/main/java/bjc/utils/funcdata/bst/DirectedWalkFunction.java deleted file mode 100644 index e341320..0000000 --- a/base/src/main/java/bjc/utils/funcdata/bst/DirectedWalkFunction.java +++ /dev/null @@ -1,44 +0,0 @@ -package bjc.utils.funcdata.bst; - -/** - * Represents a function for doing a directed walk of a binary tree. - * - * @author ben - * - * @param <T> - * The type of element stored in the walked tree - */ -@FunctionalInterface -public interface DirectedWalkFunction<T> { - /** - * Represents the results used to direct a walk in a binary tree. - * - * @author ben - */ - public enum DirectedWalkResult { - /** Specifies that the function has failed. */ - FAILURE, - /** - * Specifies that the function wants to move left in the tree - * next. - */ - LEFT, - /** - * Specifies that the function wants to move right in the tree - * next. - */ - RIGHT, - /** Specifies that the function has succesfully completed */ - SUCCESS - } - - /** - * Perform a directed walk on a node of a tree. - * - * @param element - * The data stored in the node currently being visited. - * - * @return The way the function wants the walk to go next. - */ - public DirectedWalkResult walk(T element); -} diff --git a/base/src/main/java/bjc/utils/funcdata/bst/ITreePart.java b/base/src/main/java/bjc/utils/funcdata/bst/ITreePart.java deleted file mode 100644 index f9b3d4a..0000000 --- a/base/src/main/java/bjc/utils/funcdata/bst/ITreePart.java +++ /dev/null @@ -1,104 +0,0 @@ -package bjc.utils.funcdata.bst; - -import java.util.Comparator; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * A interface for the fundamental things that want to be part of a tree. - * - * @author ben - * - * @param <T> - * The data contained in this part of the tree. - */ -public interface ITreePart<T> { - /** - * Add a element below this tree part somewhere. - * - * @param element - * The element to add below this tree part - * - * @param comparator - * The thing to use for comparing values to find where to insert - * the tree part. - */ - public void add(T element, Comparator<T> comparator); - - /** - * Collapses this tree part into a single value. - * - * Does not change the underlying tree. - * - * @param <E> - * The type of the final collapsed value - * - * @param nodeCollapser - * The function to use to transform data into mapped form. - * - * @param branchCollapser - * The function to use to collapse data in mapped form into a - * single value. - * - * @return A single value from collapsing the tree. - */ - public <E> E collapse(Function<T, E> nodeCollapser, BiFunction<E, E, E> branchCollapser); - - /** - * Check if this tre part or below it contains the specified data item. - * - * @param element - * The data item to look for. - * - * @param comparator - * The comparator to use to search for the data item. - * - * @return Whether or not the given item is contained in this tree part - * or its children. - */ - public boolean contains(T element, Comparator<T> comparator); - - /** - * Get the data associated with this tree part. - * - * @return The data associated with this tree part. - */ - public T data(); - - /** - * Remove the given node from this tree part and any of its children. - * - * @param element - * The data item to remove. - * - * @param comparator - * The comparator to use to search for the data item. - */ - public void delete(T element, Comparator<T> comparator); - - /** - * Execute a directed walk through the tree. - * - * @param walker - * The function to use to direct the walk through the tree. - * - * @return Whether the directed walk finished successfully. - */ - public boolean directedWalk(DirectedWalkFunction<T> walker); - - /** - * Execute a provided function for each element of tree it succesfully - * completes for. - * - * @param linearizationMethod - * The way to linearize the tree for executing. - * - * @param predicate - * The predicate to apply to each element, where it returning - * false terminates traversal early. - * - * @return Whether the traversal finished succesfully. - */ - public boolean forEach(TreeLinearizationMethod linearizationMethod, Predicate<T> predicate); -} diff --git a/base/src/main/java/bjc/utils/funcdata/bst/TreeLinearizationMethod.java b/base/src/main/java/bjc/utils/funcdata/bst/TreeLinearizationMethod.java deleted file mode 100644 index 80afaf2..0000000 --- a/base/src/main/java/bjc/utils/funcdata/bst/TreeLinearizationMethod.java +++ /dev/null @@ -1,24 +0,0 @@ -package bjc.utils.funcdata.bst; - -/** - * Represents the ways to linearize a tree for traversal. - * - * @author ben - */ -public enum TreeLinearizationMethod { - /** - * Visit the left side of this tree part, the tree part itself, and then - * the right part. - */ - INORDER, - /** - * Visit the left side of this tree part, the right side, and then the - * tree part itself. - */ - POSTORDER, - /** - * Visit the tree part itself, then the left side of tthis tree part and - * then the right part. - */ - PREORDER -} diff --git a/base/src/main/java/bjc/utils/funcdata/theory/Bifunctor.java b/base/src/main/java/bjc/utils/funcdata/theory/Bifunctor.java deleted file mode 100644 index 64e6b8f..0000000 --- a/base/src/main/java/bjc/utils/funcdata/theory/Bifunctor.java +++ /dev/null @@ -1,176 +0,0 @@ -package bjc.utils.funcdata.theory; - -import java.util.function.Function; - -/** - * A functor over a pair of heterogeneous types. - * - * @author ben - * - * @param <LeftType> - * The type stored on the 'left' of the pair. - * - * @param <RightType> - * The type stored on the 'right' of the pair. - */ -public interface Bifunctor<LeftType, RightType> { - /** - * Alias for functor mapping. - * - * @author EVE - * - * @param <OldLeft> - * The old left type. - * - * @param <OldRight> - * The old right type. - * - * @param <NewLeft> - * The new left type. - * - * @param <NewRight> - * The new right type. - */ - public interface BifunctorMap<OldLeft, OldRight, NewLeft, NewRight> - extends Function<Bifunctor<OldLeft, OldRight>, Bifunctor<NewLeft, NewRight>> { - /* - * Alias - */ - } - - /** - * Alias for left functor mapping. - * - * @author EVE - * - * @param <OldLeft> - * The old left type. - * - * @param <OldRight> - * The old right type. - * - * @param <NewLeft> - * The new left type. - */ - public interface LeftBifunctorMap<OldLeft, OldRight, NewLeft> - extends BifunctorMap<OldLeft, OldRight, NewLeft, OldRight> { - /* - * Alias - */ - } - - /** - * Alias for right functor mapping. - * - * @author EVE - * - * @param <OldLeft> - * The old left type. - * - * @param <OldRight> - * The old right type. - * - * @param <NewRight> - * The new right type. - */ - public interface RightBifunctorMap<OldLeft, OldRight, NewRight> - extends BifunctorMap<OldLeft, OldRight, OldLeft, NewRight> { - /* - * Alias - */ - } - - /** - * Lift a pair of functions to a single function that maps over both - * parts of a pair. - * - * @param <OldLeft> - * The old left type of the pair. - * - * @param <OldRight> - * The old right type of the pair. - * - * @param <NewLeft> - * The new left type of the pair. - * - * @param <NewRight> - * The new right type of the pair. - * - * @param leftFunc - * The function that maps over the left of the pair. - * - * @param rightFunc - * The function that maps over the right of the pair. - * - * @return A function that maps over both parts of the pair. - */ - public default <OldLeft, OldRight, NewLeft, NewRight> BifunctorMap<OldLeft, OldRight, NewLeft, NewRight> bimap( - final Function<OldLeft, NewLeft> leftFunc, final Function<OldRight, NewRight> rightFunc) { - final BifunctorMap<OldLeft, OldRight, NewLeft, NewRight> bimappedFunc = (argPair) -> { - final LeftBifunctorMap<OldLeft, OldRight, NewLeft> leftMapper = argPair.fmapLeft(leftFunc); - - final Bifunctor<NewLeft, OldRight> leftMappedFunctor = leftMapper.apply(argPair); - final RightBifunctorMap<NewLeft, OldRight, NewRight> rightMapper = leftMappedFunctor - .fmapRight(rightFunc); - - return rightMapper.apply(leftMappedFunctor); - }; - - return bimappedFunc; - } - - /** - * Lift a function to operate over the left part of this pair. - * - * @param <OldLeft> - * The old left type of the pair. - * - * @param <OldRight> - * The old right type of the pair. - * - * @param <NewLeft> - * The new left type of the pair. - * - * @param func - * The function to lift to work over the left side of the pair. - * - * @return The function lifted to work over the left side of bifunctors. - */ - public <OldLeft, OldRight, NewLeft> LeftBifunctorMap<OldLeft, OldRight, NewLeft> fmapLeft( - Function<OldLeft, NewLeft> func); - - /** - * Lift a function to operate over the right part of this pair. - * - * @param <OldLeft> - * The old left type of the pair. - * - * @param <OldRight> - * The old right type of the pair. - * - * @param <NewRight> - * The new right type of the pair. - * - * @param func - * The function to lift to work over the right side of the pair. - * - * @return The function lifted to work over the right side of - * bifunctors. - */ - public <OldLeft, OldRight, NewRight> RightBifunctorMap<OldLeft, OldRight, NewRight> fmapRight( - Function<OldRight, NewRight> func); - - /** - * Get the value contained on the left of this bifunctor. - * - * @return The value on the left side of this bifunctor. - */ - public LeftType getLeft(); - - /** - * Get the value contained on the right of this bifunctor. - * - * @return The value on the right of this bifunctor. - */ - public RightType getRight(); -} diff --git a/base/src/main/java/bjc/utils/funcdata/theory/Functor.java b/base/src/main/java/bjc/utils/funcdata/theory/Functor.java deleted file mode 100644 index 13852e6..0000000 --- a/base/src/main/java/bjc/utils/funcdata/theory/Functor.java +++ /dev/null @@ -1,43 +0,0 @@ -package bjc.utils.funcdata.theory; - -import java.util.function.Function; - -/** - * Represents a container or context some sort usually, but the precise - * definition is that it represents exactly what it is defined as. - * - * @author ben - * - * @param <ContainedType> - * The value inside the functor. - */ -public interface Functor<ContainedType> { - /** - * Converts a normal function to operate over values in a functor.. - * - * N.B: Even though the type signature implies that you can apply the - * resulting function to any type of functor, it is only safe to call it - * on instances of the type of functor you called fmap on.. - * - * @param <ArgType> - * The argument of the function. - * - * @param <ReturnType> - * The return type of the function. - * - * @param func - * The function to convert. - * - * @return The passed in function converted to work over a particular - * type of functors. - */ - public <ArgType, ReturnType> Function<Functor<ArgType>, Functor<ReturnType>> fmap( - Function<ArgType, ReturnType> func); - - /** - * Retrieve the thing inside this functor. - * - * @return The thing inside this functor. - */ - public ContainedType getValue(); -} diff --git a/base/src/main/java/bjc/utils/functypes/ID.java b/base/src/main/java/bjc/utils/functypes/ID.java deleted file mode 100644 index 62e7909..0000000 --- a/base/src/main/java/bjc/utils/functypes/ID.java +++ /dev/null @@ -1,19 +0,0 @@ -package bjc.utils.functypes; - -import java.util.function.UnaryOperator; - -/** - * Identity function. - * - * @author bjculkin - */ -public class ID { - /** - * Create an identity function. - * - * @return A identity function. - */ - public static <A> UnaryOperator<A> id() { - return (x) -> x; - } -} diff --git a/base/src/main/java/bjc/utils/functypes/ListFlattener.java b/base/src/main/java/bjc/utils/functypes/ListFlattener.java deleted file mode 100644 index 6b7908a..0000000 --- a/base/src/main/java/bjc/utils/functypes/ListFlattener.java +++ /dev/null @@ -1,19 +0,0 @@ -package bjc.utils.functypes; - -import java.util.function.Function; - -import bjc.utils.funcdata.IList; - -/** - * A function that flattens a list. - * - * @author bjculkin - * - * @param <S> - * The type of value in the list. - */ -public interface ListFlattener<S> extends Function<IList<S>, S> { - /* - * Alias - */ -} diff --git a/base/src/main/java/bjc/utils/funcutils/EnumUtils.java b/base/src/main/java/bjc/utils/funcutils/EnumUtils.java index 20c5972..37ebd50 100644 --- a/base/src/main/java/bjc/utils/funcutils/EnumUtils.java +++ b/base/src/main/java/bjc/utils/funcutils/EnumUtils.java @@ -3,8 +3,8 @@ package bjc.utils.funcutils; import java.util.Random; import java.util.function.Consumer; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Utility methods on enums. diff --git a/base/src/main/java/bjc/utils/funcutils/GroupPartIteration.java b/base/src/main/java/bjc/utils/funcutils/GroupPartIteration.java index a406c1c..455fbf8 100644 --- a/base/src/main/java/bjc/utils/funcutils/GroupPartIteration.java +++ b/base/src/main/java/bjc/utils/funcutils/GroupPartIteration.java @@ -3,8 +3,8 @@ package bjc.utils.funcutils; import java.util.function.Consumer; import java.util.function.Function; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Implements a single group partitioning pass on a list. diff --git a/base/src/main/java/bjc/utils/funcutils/ListUtils.java b/base/src/main/java/bjc/utils/funcutils/ListUtils.java index c064b2f..0be42ed 100644 --- a/base/src/main/java/bjc/utils/funcutils/ListUtils.java +++ b/base/src/main/java/bjc/utils/funcutils/ListUtils.java @@ -7,8 +7,8 @@ import java.util.List; import java.util.function.Function; import java.util.function.Supplier; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Utilities for manipulating FunctionalLists and regular Collections lists that diff --git a/base/src/main/java/bjc/utils/funcutils/TreeUtils.java b/base/src/main/java/bjc/utils/funcutils/TreeUtils.java index 8392f1c..bbb9153 100644 --- a/base/src/main/java/bjc/utils/funcutils/TreeUtils.java +++ b/base/src/main/java/bjc/utils/funcutils/TreeUtils.java @@ -4,8 +4,8 @@ import java.util.LinkedList; import java.util.function.Predicate; import bjc.data.ITree; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Implements various utilities for trees. diff --git a/base/src/main/java/bjc/utils/gen/RandomGrammar.java b/base/src/main/java/bjc/utils/gen/RandomGrammar.java index b418c79..d0a71c5 100644 --- a/base/src/main/java/bjc/utils/gen/RandomGrammar.java +++ b/base/src/main/java/bjc/utils/gen/RandomGrammar.java @@ -1,7 +1,7 @@ package bjc.utils.gen; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IList; /** * A weighted grammar where all the rules have a equal chance of occuring. diff --git a/base/src/main/java/bjc/utils/gen/WeightedGrammar.java b/base/src/main/java/bjc/utils/gen/WeightedGrammar.java index 87888bd..774d694 100644 --- a/base/src/main/java/bjc/utils/gen/WeightedGrammar.java +++ b/base/src/main/java/bjc/utils/gen/WeightedGrammar.java @@ -8,10 +8,10 @@ import java.util.function.Supplier; import bjc.data.IPair; import bjc.data.Pair; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IList; +import bjc.funcdata.IMap; /** * A random grammar, where certain rules will come up more often than others. diff --git a/base/src/main/java/bjc/utils/gen/WeightedRandom.java b/base/src/main/java/bjc/utils/gen/WeightedRandom.java index c1c1714..15f5821 100644 --- a/base/src/main/java/bjc/utils/gen/WeightedRandom.java +++ b/base/src/main/java/bjc/utils/gen/WeightedRandom.java @@ -4,8 +4,8 @@ import java.util.Random; import bjc.data.IPair; import bjc.data.Pair; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Represents a random number generator where certain results are weighted more diff --git a/base/src/main/java/bjc/utils/graph/AdjacencyMap.java b/base/src/main/java/bjc/utils/graph/AdjacencyMap.java index 7d75af5..ee360bd 100644 --- a/base/src/main/java/bjc/utils/graph/AdjacencyMap.java +++ b/base/src/main/java/bjc/utils/graph/AdjacencyMap.java @@ -8,10 +8,10 @@ import java.util.Scanner; import bjc.data.IHolder; import bjc.data.Identity; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IList; +import bjc.funcdata.IMap; import bjc.utils.funcutils.FuncUtils; /** diff --git a/base/src/main/java/bjc/utils/graph/Graph.java b/base/src/main/java/bjc/utils/graph/Graph.java index 26d300e..e092623 100644 --- a/base/src/main/java/bjc/utils/graph/Graph.java +++ b/base/src/main/java/bjc/utils/graph/Graph.java @@ -12,9 +12,9 @@ import java.util.function.BiPredicate; import bjc.data.IHolder; import bjc.data.Identity; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IList; +import bjc.funcdata.IMap; /** * A directed weighted graph, where the vertices have some arbitrary label. diff --git a/base/src/main/java/bjc/utils/gui/ExtensionFileFilter.java b/base/src/main/java/bjc/utils/gui/ExtensionFileFilter.java index 6696c92..d2129b0 100644 --- a/base/src/main/java/bjc/utils/gui/ExtensionFileFilter.java +++ b/base/src/main/java/bjc/utils/gui/ExtensionFileFilter.java @@ -5,8 +5,8 @@ import java.util.List; import javax.swing.filechooser.FileFilter; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * A file filter based on extensions. diff --git a/base/src/main/java/bjc/utils/gui/awt/ExtensionFileFilter.java b/base/src/main/java/bjc/utils/gui/awt/ExtensionFileFilter.java index ae424b4..e207a35 100644 --- a/base/src/main/java/bjc/utils/gui/awt/ExtensionFileFilter.java +++ b/base/src/main/java/bjc/utils/gui/awt/ExtensionFileFilter.java @@ -4,8 +4,8 @@ import java.io.File; import java.io.FilenameFilter; import java.util.List; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Filter a set of filenames by extension. diff --git a/base/src/main/java/bjc/utils/gui/panels/DropdownListPanel.java b/base/src/main/java/bjc/utils/gui/panels/DropdownListPanel.java index 6c57c5a..642eee9 100644 --- a/base/src/main/java/bjc/utils/gui/panels/DropdownListPanel.java +++ b/base/src/main/java/bjc/utils/gui/panels/DropdownListPanel.java @@ -9,7 +9,7 @@ import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListSelectionModel; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; import bjc.utils.gui.layout.AutosizeLayout; import bjc.utils.gui.layout.HLayout; diff --git a/base/src/main/java/bjc/utils/gui/panels/ListParameterPanel.java b/base/src/main/java/bjc/utils/gui/panels/ListParameterPanel.java index f8d9b72..d9c5966 100644 --- a/base/src/main/java/bjc/utils/gui/panels/ListParameterPanel.java +++ b/base/src/main/java/bjc/utils/gui/panels/ListParameterPanel.java @@ -9,7 +9,7 @@ import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListSelectionModel; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; import bjc.utils.gui.SimpleJList; import bjc.utils.gui.layout.HLayout; import bjc.utils.gui.layout.VLayout; diff --git a/base/src/main/java/bjc/utils/ioutils/RegexStringEditor.java b/base/src/main/java/bjc/utils/ioutils/RegexStringEditor.java index de46cbf..83672e6 100644 --- a/base/src/main/java/bjc/utils/ioutils/RegexStringEditor.java +++ b/base/src/main/java/bjc/utils/ioutils/RegexStringEditor.java @@ -7,9 +7,9 @@ import java.util.regex.Pattern; import bjc.data.Toggle; import bjc.data.ValueToggle; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; -import bjc.utils.functypes.ID; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; +import bjc.functypes.ID; /** * Editor methods for strings based off the command language for the Sam editor. diff --git a/base/src/main/java/bjc/utils/ioutils/RuleBasedConfigReader.java b/base/src/main/java/bjc/utils/ioutils/RuleBasedConfigReader.java index c9ac659..2ee25d1 100644 --- a/base/src/main/java/bjc/utils/ioutils/RuleBasedConfigReader.java +++ b/base/src/main/java/bjc/utils/ioutils/RuleBasedConfigReader.java @@ -11,9 +11,9 @@ import bjc.data.IPair; import bjc.data.Identity; import bjc.data.Pair; import bjc.utils.exceptions.UnknownPragmaException; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.FunctionalStringTokenizer; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.FunctionalStringTokenizer; +import bjc.funcdata.IMap; /** * This class parses a rules based config file, and uses it to drive a provided diff --git a/base/src/main/java/bjc/utils/ioutils/RuleBasedReaderPragmas.java b/base/src/main/java/bjc/utils/ioutils/RuleBasedReaderPragmas.java index 5d19337..7e7550e 100644 --- a/base/src/main/java/bjc/utils/ioutils/RuleBasedReaderPragmas.java +++ b/base/src/main/java/bjc/utils/ioutils/RuleBasedReaderPragmas.java @@ -3,7 +3,7 @@ package bjc.utils.ioutils; import java.util.function.BiConsumer; import bjc.utils.exceptions.PragmaFormatException; -import bjc.utils.funcdata.FunctionalStringTokenizer; +import bjc.funcdata.FunctionalStringTokenizer; import bjc.utils.funcutils.ListUtils; /** diff --git a/base/src/main/java/bjc/utils/misc/Direction.java b/base/src/main/java/bjc/utils/misc/Direction.java index a530f47..b8a982e 100644 --- a/base/src/main/java/bjc/utils/misc/Direction.java +++ b/base/src/main/java/bjc/utils/misc/Direction.java @@ -6,8 +6,8 @@ import java.util.function.Consumer; import org.apache.commons.lang3.text.WordUtils; import bjc.utils.exceptions.InvalidDirectionException; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * A set of cardinal directions diff --git a/base/src/main/java/bjc/utils/misc/RelativeDirection.java b/base/src/main/java/bjc/utils/misc/RelativeDirection.java index d7ccf6e..515ddea 100644 --- a/base/src/main/java/bjc/utils/misc/RelativeDirection.java +++ b/base/src/main/java/bjc/utils/misc/RelativeDirection.java @@ -4,8 +4,8 @@ import java.util.Random; import java.util.function.Consumer; import bjc.utils.exceptions.InvalidDirectionException; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Represents a direction that is relative to another direction diff --git a/base/src/main/java/bjc/utils/parserutils/ShuntingYard.java b/base/src/main/java/bjc/utils/parserutils/ShuntingYard.java index 12bc148..bf332f5 100644 --- a/base/src/main/java/bjc/utils/parserutils/ShuntingYard.java +++ b/base/src/main/java/bjc/utils/parserutils/ShuntingYard.java @@ -4,10 +4,10 @@ import java.util.Deque; import java.util.LinkedList; import java.util.function.Function; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.FunctionalMap; +import bjc.funcdata.IList; +import bjc.funcdata.IMap; import bjc.utils.funcutils.StringUtils; /** diff --git a/base/src/main/java/bjc/utils/parserutils/TokenUtils.java b/base/src/main/java/bjc/utils/parserutils/TokenUtils.java index bcce97e..fbffd82 100644 --- a/base/src/main/java/bjc/utils/parserutils/TokenUtils.java +++ b/base/src/main/java/bjc/utils/parserutils/TokenUtils.java @@ -9,8 +9,8 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; import bjc.utils.parserutils.splitter.TokenSplitter; /** diff --git a/base/src/main/java/bjc/utils/parserutils/TreeConstructor.java b/base/src/main/java/bjc/utils/parserutils/TreeConstructor.java index 2b3a831..1ebc2d5 100644 --- a/base/src/main/java/bjc/utils/parserutils/TreeConstructor.java +++ b/base/src/main/java/bjc/utils/parserutils/TreeConstructor.java @@ -10,7 +10,7 @@ import bjc.data.IPair; import bjc.data.ITree; import bjc.data.Identity; import bjc.data.Pair; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; /** * Creates a parse tree from a postfix expression. diff --git a/base/src/main/java/bjc/utils/parserutils/delims/DelimiterGroup.java b/base/src/main/java/bjc/utils/parserutils/delims/DelimiterGroup.java index 72184b6..96830b2 100644 --- a/base/src/main/java/bjc/utils/parserutils/delims/DelimiterGroup.java +++ b/base/src/main/java/bjc/utils/parserutils/delims/DelimiterGroup.java @@ -15,8 +15,8 @@ import bjc.data.IPair; import bjc.data.ITree; import bjc.data.Pair; import bjc.data.Tree; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * Represents a possible delimiter group to match. diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/ChainTokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/ChainTokenSplitter.java index db851f0..a5a044a 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/ChainTokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/ChainTokenSplitter.java @@ -1,7 +1,7 @@ package bjc.utils.parserutils.splitter; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * A token splitter that chains several other splitters together. diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/ConfigurableTokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/ConfigurableTokenSplitter.java index 1ca0fc1..603c214 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/ConfigurableTokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/ConfigurableTokenSplitter.java @@ -6,7 +6,7 @@ import java.util.LinkedHashSet; import java.util.Set; import java.util.regex.Pattern; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; /** * Split a string into pieces around a regular expression, and offer an easy way diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/ExcludingTokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/ExcludingTokenSplitter.java index 3e58629..8bdb176 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/ExcludingTokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/ExcludingTokenSplitter.java @@ -4,8 +4,8 @@ import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; -import bjc.utils.funcdata.FunctionalList; -import bjc.utils.funcdata.IList; +import bjc.funcdata.FunctionalList; +import bjc.funcdata.IList; /** * A token splitter that will not split certain tokens. diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/FilteredTokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/FilteredTokenSplitter.java index 87d950b..3bcbea2 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/FilteredTokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/FilteredTokenSplitter.java @@ -2,7 +2,7 @@ package bjc.utils.parserutils.splitter; import java.util.function.Predicate; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; /** * A token splitter that removes tokens that match a predicate from the stream diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/SimpleTokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/SimpleTokenSplitter.java index 9eb2d48..8f4fb6c 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/SimpleTokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/SimpleTokenSplitter.java @@ -2,8 +2,8 @@ package bjc.utils.parserutils.splitter; import java.util.regex.Pattern; -import bjc.utils.funcdata.IList; -import bjc.utils.functypes.ID; +import bjc.funcdata.IList; +import bjc.functypes.ID; import bjc.utils.ioutils.RegexStringEditor; /** diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/TokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/TokenSplitter.java index b042b8c..f2d9c73 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/TokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/TokenSplitter.java @@ -1,6 +1,6 @@ package bjc.utils.parserutils.splitter; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; /** * Split a string into a list of pieces. diff --git a/base/src/main/java/bjc/utils/parserutils/splitter/TransformTokenSplitter.java b/base/src/main/java/bjc/utils/parserutils/splitter/TransformTokenSplitter.java index 1aa894d..3cbe103 100644 --- a/base/src/main/java/bjc/utils/parserutils/splitter/TransformTokenSplitter.java +++ b/base/src/main/java/bjc/utils/parserutils/splitter/TransformTokenSplitter.java @@ -2,7 +2,7 @@ package bjc.utils.parserutils.splitter; import java.util.function.UnaryOperator; -import bjc.utils.funcdata.IList; +import bjc.funcdata.IList; /** * A token splitter that performs a transform on the tokens from another |
