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: