@Override public C.List<T> tail() { int sz = size(); if (sz == 0) { throw new UnsupportedOperationException(); } return subList(1, sz); }
@Override public <R> R reduceRight(R identity, $.Func2<R, T, R> accumulator) { int sz = size(); R ret = identity; T[] data = data_; for (int i = sz - 1; i >= 0; --i) { ret = accumulator.apply(ret, data[i]); } return ret; }
@Override public <R> R reduceRight(R identity, $.Func2<R, T, R> accumulator) { int sz = size(); R ret = identity; T[] data = data_; for (int i = sz - 1; i >= 0; --i) { ret = accumulator.apply(ret, data[i]); } return ret; }
@Override public <R> R reduceLeft(R identity, $.Func2<R, T, R> accumulator) { int sz = size(); R ret = identity; T[] data = data_; for (int i = 0; i < sz; ++i) { ret = accumulator.apply(ret, data[i]); } return ret; }
@Override public <R> R reduceLeft(R identity, $.Func2<R, T, R> accumulator) { int sz = size(); R ret = identity; T[] data = data_; for (int i = 0; i < sz; ++i) { ret = accumulator.apply(ret, data[i]); } return ret; }
@Override public C.List<T> prepend(T t) { int sz = size(); T[] myData = data_; T[] data = $.newArray(myData, sz + 1); data[0] = t; System.arraycopy(myData, 0, data, 1, sz); return of(data); }
@Override public C.List<T> append(T t) { int sz = size(); T[] myData = data_; T[] data = $.newArray(myData, sz + 1); data[sz] = t; System.arraycopy(myData, 0, data, 0, sz); return of(data); }
@Override public C.List<T> tail(int n) { if (n < 0) { return head(-n); } int sz = size(); if (n >= sz) { return this; } return subList(sz - n, sz); }
@Override public $.Option<T> reduceLeft($.Func2<T, T, T> accumulator) { int sz = size(); T[] data = data_; T ret = data[0]; for (int i = 1; i < sz; ++i) { ret = accumulator.apply(ret, data[i]); } return $.some(ret); }
@Override public $.Option<T> reduceRight($.Func2<T, T, T> accumulator) { int sz = size(); T[] data = data_; T ret = data[sz - 1]; for (int i = sz - 2; i >= 0; --i) { ret = accumulator.apply(ret, data[i]); } return $.some(ret); }
@Override public $.Option<T> reduceLeft($.Func2<T, T, T> accumulator) { int sz = size(); T[] data = data_; T ret = data[0]; for (int i = 1; i < sz; ++i) { ret = accumulator.apply(ret, data[i]); } return $.some(ret); }
@Override public C.List<T> dropWhile($.Function<? super T, Boolean> predicate) { //TODO: handle lazy operation int sz = size(); $.Function<T, Boolean> f = $.F.negate(predicate); Cursor<T> cursor = locateFirst(f); if (!cursor.isDefined()) { return Nil.list(); } int id = cursor.index(); return subList(id, size()); }
@Override public Cursor<T> locateFirst($.Function<T, Boolean> predicate) { int sz = size(); T[] data = data_; for (int i = 0; i < sz; ++i) { T t = data[i]; if (predicate.apply(t)) { return new Csr(i); } } return new Csr(sz); }
@Override public C.List<T> without(T element) { int sz = size(); T[] data = data_; ListBuilder<T> lb = new ListBuilder<T>(sz); for (int i = 0; i < sz; ++i) { T t = data[i]; if ($.ne(t, element)) { lb.add(t); } } return lb.toList(); }
@Override public <R> C.List<R> flatMap($.Function<? super T, ? extends Iterable<? extends R>> mapper ) { // TODO: handle lazy operation int sz = size(); ListBuilder<R> lb = new ListBuilder<R>(sz * 3); forEach($.visitor($.f1(mapper).andThen(C.F.addAllTo(lb)))); return lb.toList(); }
@Override public C.Sequence<T> append(Enumeration<? extends T> enumeration) { if (isLazy()) { return CompositeSeq.of(this, C.seq(enumeration)); } ListBuilder<T> lb = new ListBuilder<T>(size() * 2); lb.append(this).append(enumeration); return lb.toList(); }
@Override public C.Sequence<T> append(C.Sequence<? extends T> seq) { if (seq instanceof C.List) { return appendList((C.List<T>) seq); } if (isLazy()) { return CompositeSeq.of(this, seq); } ListBuilder<T> lb = new ListBuilder<T>(size() * 2); lb.append(this).append(seq); return lb.toList(); }
@Override public C.Sequence<T> append(Iterator<? extends T> iterator) { if (isLazy()) { return CompositeSeq.of(this, C.seq(iterator)); } ListBuilder<T> lb = new ListBuilder<T>(size() * 2); lb.append(this).append(iterator); return lb.toList(); }
@Override public C.Sequence<T> prepend(C.Sequence<? extends T> seq) { if (seq instanceof C.List) { return prependList((C.List<T>) seq); } if (isLazy()) { return CompositeSeq.of(seq, this); } ListBuilder<T> lb = new ListBuilder<T>(size() * 2); lb.append(seq).append(this); return lb.toList(); }