@Override
 protected PriorityQueue<Float> ofAll(float[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Long> ofAll(long[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Character> ofAll(char[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Double> ofAll(double[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Boolean> ofAll(boolean[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Byte> ofAll(byte[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Integer> ofAll(int[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Override
 protected PriorityQueue<Short> ofAll(short[] array) {
   return PriorityQueue.ofAll(List.ofAll(array));
 }
 @Test
 public void shouldNarrowQueue() {
   final PriorityQueue<Double> doubles = of(1.0d);
   final PriorityQueue<Number> numbers = PriorityQueue.narrow(doubles);
   final int actual = numbers.enqueue(new BigDecimal("2.0")).sum().intValue();
   assertThat(actual).isEqualTo(3);
 }
 private void assertMinimumsAreEqual(
     java.util.PriorityQueue<Integer> oldQueue, PriorityQueue<Integer> newQueue) {
   assertThat(oldQueue.isEmpty()).isEqualTo(newQueue.isEmpty());
   if (!newQueue.isEmpty()) {
     assertThat(oldQueue.peek()).isEqualTo(newQueue.head());
   }
 }
  @Test
  public void shouldMergeTwoPriorityQueues() {
    final PriorityQueue<Integer> source = of(3, 1, 4, 1, 5);
    final PriorityQueue<Integer> target = of(9, 2, 6, 5, 3);
    assertThat(source.merge(target)).isEqualTo(of(3, 1, 4, 1, 5, 9, 2, 6, 5, 3));

    assertThat(PriorityQueue.of(3).merge(PriorityQueue.of(toStringComparator(), 1)))
        .isEqualTo(of(3, 1));
  }
 @Test
 public void shouldComputeDistinctOfNonEmptyTraversableUsingKeyExtractor() {
   final Comparator<String> comparator = (o1, o2) -> Integer.compare(o1.charAt(1), o2.charAt(1));
   assertThat(
           PriorityQueue.of(comparator, "5c", "1a", "3a", "1a", "2a", "4b", "3b")
               .distinct()
               .map(s -> s.substring(1)))
       .isEqualTo(of("a", "b", "c"));
 }
 @Override
 protected <T> PriorityQueue<T> of(T element) {
   return PriorityQueue.ofAll(toStringComparator(), List.of(element));
 }
 @Override
 protected <T> Traversable<T> ofJavaStream(Stream<? extends T> javaStream) {
   return PriorityQueue.ofAll(toStringComparator(), javaStream);
 }
 @Override
 protected <T> PriorityQueue<T> empty() {
   return PriorityQueue.empty(toStringComparator());
 }
 @Override
 protected <T> Collector<T, ArrayList<T>, PriorityQueue<T>> collector() {
   return PriorityQueue.collector();
 }
 @Test
 public void shouldKeepInstanceOfPriorityQueue() {
   final PriorityQueue<Integer> queue = PriorityQueue.of(1, 3, 2);
   assertThat(queue.toPriorityQueue()).isSameAs(queue);
 }
 @Test
 public void toListIsSortedAccordingToComparator() {
   final Comparator<Integer> comparator = composedComparator();
   final PriorityQueue<Integer> queue = PriorityQueue.ofAll(comparator, values);
   assertThat(queue.toList()).isEqualTo(values.sorted(comparator));
 }
 @Override
 @SuppressWarnings("unchecked")
 protected final <T> PriorityQueue<T> of(T... elements) {
   return PriorityQueue.ofAll(toStringComparator(), List.of(elements));
 }
 @Override
 protected <T> PriorityQueue<T> ofAll(Iterable<? extends T> elements) {
   return PriorityQueue.ofAll(toStringComparator(), elements);
 }
 @Override
 protected <T> PriorityQueue<T> tabulate(int n, Function<? super Integer, ? extends T> f) {
   return PriorityQueue.tabulate(n, f);
 }
 @Override
 protected <T> PriorityQueue<T> fill(int n, Supplier<? extends T> s) {
   return PriorityQueue.fill(n, s);
 }