private static <T> void trickleDown(
     final Object[] deque, final int size, int index, final Comparator<? super T> comparator) {
   if (Level.MIN.equals(getLevel(size, index))) {
     if (comparator == null) trickleDownMin(deque, size, index);
     else trickleDownMinComparator(deque, size, index, comparator);
   } else {
     if (comparator == null) trickleDownMax(deque, size, index);
     else trickleDownMaxComparator(deque, size, index, comparator);
   }
 }
 @SuppressWarnings("unchecked")
 private static <T> void bubbleUpComparator(
     final Object[] deque, final int size, int index, final Comparator<? super T> comparator) {
   int parentIndex = getParentIndex(index);
   if (Level.MIN.equals(getLevel(size, index))) {
     if (index > 0 && comparator.compare((T) deque[index], (T) deque[parentIndex]) > 0) {
       swap(deque, size, index, parentIndex);
       bubbleUpMaxComparator(deque, size, parentIndex, comparator);
     } else {
       bubbleUpMinComparator(deque, size, index, comparator);
     }
   } else {
     if (index > 0 && comparator.compare((T) deque[index], (T) deque[parentIndex]) < 1) {
       swap(deque, size, index, parentIndex);
       bubbleUpMinComparator(deque, size, parentIndex, comparator);
     } else {
       bubbleUpMaxComparator(deque, size, index, comparator);
     }
   }
 }
 @SuppressWarnings("unchecked")
 private static <T> void bubbleUp(final Object[] deque, final int size, int index) {
   int parentIndex = getParentIndex(index);
   if (Level.MIN.equals(getLevel(size, index))) {
     if (index > 0
         && ((Comparable<? super T>) deque[index]).compareTo((T) deque[parentIndex]) > 0) {
       swap(deque, size, index, parentIndex);
       bubbleUpMax(deque, size, parentIndex);
     } else {
       bubbleUpMin(deque, size, index);
     }
   } else {
     if (index > 0
         && ((Comparable<? super T>) deque[index]).compareTo((T) deque[parentIndex]) < 1) {
       swap(deque, size, index, parentIndex);
       bubbleUpMin(deque, size, parentIndex);
     } else {
       bubbleUpMax(deque, size, index);
     }
   }
 }