00001: package clogs.util;
00002: 
00003: 
00004: class ListCons<A> extends List<A>
00005: {
00006:   final A head;
00007:   final List<A> tail;
00008: 
00009: 
00010:   ListCons (A head, List<A> tail)
00011:   {
00012:     NonNull.check (head, tail);
00013:     this.head = head;
00014:     this.tail = tail;
00015:   }
00016: 
00017: 
00018:   public boolean isNil ()
00019:   {
00020:     return false;
00021:   }
00022: 
00023: 
00024:   public int size ()
00025:   {
00026:     return 1 + tail.size ();
00027:   }
00028: 
00029: 
00030:   public A head () 
00031:     throws EmptyListException
00032:   {
00033:     return head;
00034:   }
00035: 
00036: 
00037:   public List<A> tail () 
00038:     throws EmptyListException
00039:   {
00040:     return tail;
00041:   }
00042: 
00043: 
00044:   public List<A> concat (List<A> l)
00045:   {
00046:     return tail.concat (l).cons (head);
00047:   }
00048: 
00049: 
00050:   public List<A> reverse ()
00051:   {
00052:     return reverseAux (List.<A>nil ());
00053:   }
00054: 
00055: 
00056:   public List<A> reverseAux (List<A> end)
00057:   {
00058:     return tail.reverseAux (end.cons (head));
00059:   }
00060: 
00061: 
00062:   @SuppressWarnings("unchecked")
00063:   public boolean equals (Object o)
00064:   {
00065:     if (o instanceof ListCons) {
00066:       ListCons<A> lCons = (ListCons) o;
00067:       return head.equals (lCons.head) && tail.equals (lCons.tail);
00068:     } else {
00069:       return false;
00070:     }
00071:   }
00072: }
00073: