@Override public C.List<T> tail() { int sz = size(); if (sz == 0) { throw new UnsupportedOperationException(); } return subList(1, sz); }
@Override public C.List<T> tail() { int sz = size(); if (sz == 0) { throw new UnsupportedOperationException(); } return subList(1, sz); }
@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 C.List<T> take(int n) { if (n < 0) { return tail(-n); } int sz = size(); if (n >= sz) { return this; } return subList(0, n); }
@Override public C.List<T> take(int n) { if (n < 0) { return tail(-n); } int sz = size(); if (n >= sz) { return this; } return subList(0, n); }
@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 C.List<T> drop(int n) throws IndexOutOfBoundsException { int size = size(); if (n < 0) { n = -n; if (n >= size) return C.list(); return take(size - n); } if (0 == n) { return this; } if (n >= size) { return Nil.list(); } return subList(n, size()); }
@Override public C.List<T> drop(int n) throws IndexOutOfBoundsException { int size = size(); if (n < 0) { n = -n; if (n >= size) return C.list(); return take(size - n); } if (0 == n) { return this; } if (n >= size) { return Nil.list(); } return subList(n, size()); }
@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 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()); }