diff --git a/src/main/java/org/warp/commonutils/type/FloatPriorityQueue.java b/src/main/java/org/warp/commonutils/type/FloatPriorityQueue.java index fa8fab0..fc064ec 100644 --- a/src/main/java/org/warp/commonutils/type/FloatPriorityQueue.java +++ b/src/main/java/org/warp/commonutils/type/FloatPriorityQueue.java @@ -285,6 +285,10 @@ public class FloatPriorityQueue implements Queue { return internalQueue.stream(); } + public FloatPriorityQueueView view() { + return new FloatPriorityQueueView(this); + } + private static class SynchronizedFloatPriorityQueue extends FloatPriorityQueue { public SynchronizedFloatPriorityQueue(Object2FloatMap contentValues, Queue> internalQueue) { diff --git a/src/main/java/org/warp/commonutils/type/FloatPriorityQueueView.java b/src/main/java/org/warp/commonutils/type/FloatPriorityQueueView.java new file mode 100644 index 0000000..2abb12f --- /dev/null +++ b/src/main/java/org/warp/commonutils/type/FloatPriorityQueueView.java @@ -0,0 +1,150 @@ +package org.warp.commonutils.type; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Queue; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.stream.Stream; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class FloatPriorityQueueView implements Queue { + + private final FloatPriorityQueue queue; + + public FloatPriorityQueueView(FloatPriorityQueue queue) { + this.queue = queue; + } + + public static BiFunction, FloatPriorityQueueView, FloatPriorityQueueView> aggregator() { + return (a, b) -> { + var fpq = new FloatPriorityQueue<>(); + a.forEachItem(fpq::offer); + b.forEachItem(fpq::offer); + return new FloatPriorityQueueView<>(fpq); + }; + } + + public static FloatPriorityQueueView of() { + return new FloatPriorityQueueView<>(FloatPriorityQueue.of()); + } + + @Override + public int size() { + return queue.size(); + } + + @Override + public boolean isEmpty() { + return queue.isEmpty(); + } + + @Override + public boolean contains(Object o) { + return queue.contains(o); + } + + @NotNull + @Override + public Iterator iterator() { + var it = queue.iterator(); + return new Iterator<>() { + @Override + public boolean hasNext() { + return it.hasNext(); + } + + @SuppressWarnings("unchecked") + @Override + public T next() { + return (T) it.next(); + } + }; + } + + @NotNull + @Override + public Object[] toArray() { + return queue.toArray(); + } + + @NotNull + @Override + public T1[] toArray(@NotNull T1[] a) { + //noinspection SuspiciousToArrayCall + return queue.toArray(a); + } + + @Override + public boolean containsAll(@NotNull Collection c) { + return queue.containsAll(c); + } + + @Override + public boolean addAll(@NotNull Collection c) { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public boolean removeAll(@NotNull Collection c) { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public boolean retainAll(@NotNull Collection c) { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public void clear() { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public boolean add(T t) { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public boolean remove(Object o) { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public boolean offer(T t) { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public T remove() { + throw new UnsupportedOperationException("Read-only"); + } + + @Override + public T poll() { + throw new UnsupportedOperationException("Read-only"); + } + + @SuppressWarnings("unchecked") + @Override + public T element() { + return (T) queue.element(); + } + + @SuppressWarnings("unchecked") + @Override + public T peek() { + return (T) queue.peek(); + } + + @SuppressWarnings("unchecked") + public void forEachItem(Consumer> action) { + queue.forEachItem((v) -> action.accept((ScoredValue) v)); + } + + @SuppressWarnings("unchecked") + public Stream> streamItems() { + return queue.streamItems().map(t -> (ScoredValue) t); + } +}