|
@@ -0,0 +1,85 @@
|
|
|
+package migl.util;
|
|
|
+
|
|
|
+import java.util.Iterator;
|
|
|
+import java.util.function.Function;
|
|
|
+
|
|
|
+public class ConsListImpl<E> extends Cons<E, ConsList<E>> implements ConsList<E>{
|
|
|
+
|
|
|
+ private final int size;
|
|
|
+
|
|
|
+ public ConsListImpl(E left, ConsList<E> right) {
|
|
|
+ super(left, right);
|
|
|
+ if(left == null) {
|
|
|
+ this.size = 0;
|
|
|
+ } else if(right == null) {
|
|
|
+ this.size = 1;
|
|
|
+ } else {
|
|
|
+ this.size = 1 + right.size();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Iterator<E> iterator() {
|
|
|
+ return new Iterator<E>() {
|
|
|
+ private ConsList<E> current = ConsListImpl.this;
|
|
|
+ @Override
|
|
|
+ public boolean hasNext() {
|
|
|
+ return !current.isEmpty();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public E next() {
|
|
|
+ E e = current.car();
|
|
|
+ current = current.cdr();
|
|
|
+ return e;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ConsList<E> prepend(E e) {
|
|
|
+ return new ConsListImpl<>(e, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ConsList<E> append(E e) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isEmpty() {
|
|
|
+ return this.size == 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public E car() {
|
|
|
+ return this.left();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ConsList<E> cdr() {
|
|
|
+ return this.right();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int size() {
|
|
|
+ return this.size;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public <T> ConsList<T> map(Function<E, T> f) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String toString() {
|
|
|
+ String str = "(";
|
|
|
+ for(E e : this) {
|
|
|
+ str += e.toString() + " ";
|
|
|
+ }
|
|
|
+ return str.trim() + ")";
|
|
|
+ }
|
|
|
+
|
|
|
+}
|