"""
In-class demo of linked list.
"""

class TrainCar(object):
  def __init__(self, contents):
    self.contents = contents
    self.next_car = None
  def get_next_car(self):
    return self.next_car
  def set_next_car(self, next_car):
    self.next_car = next_car
  def get_contents(self):
    return self.contents
  def set_contents(self, contents):
    self.contents = contents

class TrainEngine(object):
  def __init__(self):
    self.first_car = None
  def add_car_to_front(self, car):
    old_first_car = self.first_car
    self.first_car = car
    self.first_car.set_next_car(old_first_car)
  def add_car_after_front(self, car, index):
    before_car = self.get_car(index-1)
    old_car = before_car.get_next_car()
    before_car.set_next_car(car)
    car.set_next_car(old_car)
  def get_car(self, index):
    current_car = self.first_car
    for i in range(index):
      current_car = current_car.get_next_car()
    return current_car
  # Functions I want a user to interact with
  def add(self, value, index):
    if index == 0:
      car = TrainCar(value)
      self.add_car_to_front(car)
    else:
      car = TrainCar(value)
      self.add_car_after_front(car, index)
  #def add_to_front(self, value):
  #  car = TrainCar(value)
  #  self.add_car_to_front(car)
  def get(self, index):
    car = self.get_car(index)
    return car.get_contents()
  #def add_after_front(self, value, index):
  #  car = TrainCar(value)
  #  self.add_car_after_front(car, index)
 
def main():
  engine = TrainEngine()
  #car = TrainCar("cat")
  #engine.add_car_to_front(car)
  #car = TrainCar("dog")
  #engine.add_car_to_front(car)
  #car = TrainCar("bear")
  #engine.add_car_to_front(car)
  engine.add("cat",0)
  engine.add("dog",0)
  engine.add("bear",0)
  engine.add("fish",2)
  #car_at_index_2 = engine.get_car(2)
  #print car_at_index_2.get_contents()
  print engine.get(2)

main()



