import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * Some experiments to better understand linked lists
 */
public class TestYDLL
{
  public static void main(String[] args)
    throws Exception
  {
    // Prepare input and screenput.
    BufferedReader keyboard = 
      new BufferedReader(new InputStreamReader(System.in));
    PrintWriter screen = new PrintWriter(System.out, true);

    // Create a list for simple testing.
    YDLL ll = new YDLL();
    ll.addToEnd("end");
    screen.println("List is " + ll);
    screen.println("After deleting " + ll.removeFirst() 
                   + " the list is now " + ll + ". Its length is " + ll.length);
    ll.addToEnd("newend");
    screen.println("After adding newend, the list is now " + ll + ". Its length is " + ll.length);
    
    // Create a list and print it out.
    YDLL lst = new YDLL();
    screen.println(lst);
    for (int i = 9; i > 0; i--) {
      Object val = new Integer(i);
      screen.print("Adding " + val + " to front: ");
      lst.addToFront(val);
      screen.println(lst + ". I's length is " + lst.length);
    }
    for (int i = 0; i < 9; i++) {
      Object val = new Character((char) ('a' + i));
      screen.print("Adding " + val + " to end: ");
      lst.addToEnd(val);
      screen.println(lst + ". Its length is " + lst.length);
    }

    // Remove a few lines
    for (int i = 0; i < 5; i++) {
      try {
        screen.println("Deleting first element ... " + lst.removeFirst());
        screen.println(lst);
      }
      catch (Exception e) {
        screen.println("Deletion failed ... empty list.");
      }
    } // for
// Remove a few lines using remove last
    for (int i = 0; i < 5; i++) {
      try {
        screen.println("Deleting last element ... " + lst.removeLast() + ". Its length is " + lst.length);
        screen.println(lst);
      }
      catch (Exception e) {
        screen.println("Deletion failed ... " + e + ".");
      }
    } // for

    // That's it, we're done.
    System.exit(0);
  } // main(String[])

} // class TestYDLL

