/*
 * Copyright 2010 Google Inc.
 *
 * 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 elemental.util;

/**
 * A lightweight array of homogeneous Object values.
 *
 * @param <T>
 *
 * @see elemental.js.util.JsArrayOf
 */
public interface ArrayOf<T> {

  /**
   * Returns a new array that is the concatenation of this array and <code>
   * values</code>. This method does not mutate the current array.
   */
  ArrayOf<T> concat(ArrayOf<T> values);

  /**
   * Indicates whether the array contains the specified value.
   */
  boolean contains(T value);

  /**
   * Gets the value at a given index.
   *
   * @param index the index to be retrieved
   * @return the value at the given index
   */
  T get(int index);

  /**
   * Returns the index of the specified value or <code>-1</code> if the value is
   * not found.
   */
  int indexOf(T value);

  /**
   * Inserts a new element into the array at the specified index.
   *
   *  Note: If index >= the length of the array, the element will be appended to
   * the end. Also if the index is negative, the element will be inserted
   * starting from the end of the array.
   */
  void insert(int index, T value);

  /**
   * Returns true if the length of the array is zero.
   *
   * @return true when length is zero
   */
  boolean isEmpty();

  /**
   * Convert each element of the array to a String and join them with a comma
   * separator. The value returned from this method may vary between browsers
   * based on how JavaScript values are converted into strings.
   */
  String join();

  /**
   * Convert each element of the array to a String and join them with a comma
   * separator. The value returned from this method may vary between browsers
   * based on how JavaScript values are converted into strings.
   */
  String join(String separator);

  /**
   * Gets the length of the array.
   *
   * @return the array length
   */
  int length();

  /**
   * Returns the last value of the array;
   *
   * @return the last value
   */
  T peek();

  /**
   * Remove and return the element from the end of the array.
   *
   * @return the removed value
   */
  T pop();

  /**
   * Pushes the given value onto the end of the array.
   */
  void push(T value);

  /**
   * Searches for the specified value in the array and removes the first
   * occurrence if found.
   */
  void remove(T value);

  /**
   * Removes the element at the specified index.
   */
  void removeByIndex(int index);

  /**
   * sets the value value at a given index.
   *
   *  if the index is out of bounds, the value will still be set. the array's
   * length will be updated to encompass the bounds implied by the added value.
   *
   * @param index the index to be set
   * @param value the value to be stored
   */
  void set(int index, T value);

  /**
   * Reset the length of the array.
   *
   * @param length the new length of the array
   */
  void setLength(int length);

  /**
   * Shifts the first value off the array.
   *
   * @return the shifted value
   */
  T shift();

  /**
   * Sorts the contents of the Array based on the {@link CanCompare}.
   *
   * @param comparator
   */
  void sort(CanCompare<T> comparator);

  /**
   * Removes the specified number of elements starting at index and returns the
   * removed elements.
   */
  ArrayOf<T> splice(int index, int count);

  /**
   * Shifts a value onto the beginning of the array.
   *
   * @param value the value to the stored
   */
  void unshift(T value);
}
