/*
 * Copyright (C) 2011 The Guava Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.common.collect;

import com.google.common.annotations.Beta;
import java.util.Comparator;
import java.util.SortedSet;

/**
 * GWT emulation of {@code SortedMultiset}, with {@code elementSet} reduced to returning a {@code
 * SortedSet} for GWT compatibility.
 *
 * @author Louis Wasserman
 * @since 11.0
 */
@Beta
public interface SortedMultiset<E> extends Multiset<E>, SortedIterable<E> {
  Comparator<? super E> comparator();

  Entry<E> firstEntry();

  Entry<E> lastEntry();

  Entry<E> pollFirstEntry();

  Entry<E> pollLastEntry();

  /**
   * Returns a {@link SortedSet} view of the distinct elements in this multiset. (Outside GWT, this
   * returns a {@code NavigableSet}.)
   */
  @Override
  SortedSet<E> elementSet();

  SortedMultiset<E> descendingMultiset();

  SortedMultiset<E> headMultiset(E upperBound, BoundType boundType);

  SortedMultiset<E> subMultiset(
      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType);

  SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType);
}
