jmud-0.11/
jmud-0.11/bin/
jmud-0.11/doc/
jmud-0.11/rec/
jmud-0.11/rec/mun/
jmud-0.11/rec/mun/grecia/
jmud-0.11/rec/mun/gunnar/
jmud-0.11/rec/qua/
jmud-0.11/src/bool/
jmud-0.11/src/clone/
jmud-0.11/src/integer/
jmud-0.11/src/misc/
jmud-0.11/src/string/
jmud-0.11/src/util/bit/
jmud-0.11/src/util/color/
jmud-0.11/src/util/file/
jmud-0.11/src/util/jgp/adaptor/
jmud-0.11/src/util/jgp/algorithm/
jmud-0.11/src/util/jgp/container/
jmud-0.11/src/util/jgp/functor/
jmud-0.11/src/util/jgp/interfaces/
jmud-0.11/src/util/jgp/predicate/
jmud-0.11/src/util/log/
jmud-0.11/src/util/state/
jmud-0.11/trash/
package util.nice;

import java.util.NoSuchElementException;

public class NiceList implements NiceEnumerable, NiceIterateable, Cloneable {

  protected NiceListLink head = null;

  NiceListLink getHead() {
    return head;
  }

  public NiceList() {
  }

  private void add(NiceListLink aLink) {
    aLink.setNext(head);
    head = aLink;
  }

  public boolean isEmpty() {
    return head == null;
  }

  public void insert(Niceable info) {
    add(new NiceListLink(info, null));
  }

  public void remove(Niceable info) throws NoSuchElementException {
    
    if (head != null) {
      NiceListLink prevLink = head;
      
      if (prevLink.getInfo() == info) {
	head = prevLink.getNext();
	return;
      }
      
      while (prevLink.getNext() != null) {
	NiceListLink currLink = prevLink.getNext();
	
	if (currLink.getInfo() == info) {
	  prevLink.setNext(currLink.getNext());
	  return;
	}
	
	prevLink = currLink;
      }
    }

    throw new NoSuchElementException();
  }

  public NiceEnumeration elements() {
    return new NiceListEnumeration(this);
  }

  public Object clone() {

    NiceList cloneList = new NiceList();
    NiceEnumeration myElements = elements();

    if (myElements.hasMoreElements()) {

      NiceListLink prevLink = new NiceListLink(myElements.nextElement(), null);
      cloneList.add(prevLink);

      while (myElements.hasMoreElements()) {
	prevLink.setNext(new NiceListLink(myElements.nextElement(), null));
	prevLink = prevLink.getNext();
      }

    }

    return cloneList;
  }

  public NiceIterator getIterator() {
    return new NiceListIterator(this);
  }
}