@Override public Vector<T> dropRight(int n) { return take(length() - n); }
@Override public Vector<T> patch(int from, Iterable<? extends T> that, int replaced) { from = Math.max(from, 0); replaced = Math.max(replaced, 0); Vector<T> result = take(from).appendAll(that); from += replaced; result = result.appendAll(drop(from)); return result; }
@Override public Tuple2<Vector<T>, Vector<T>> splitAt(int n) { return Tuple.of(take(n), drop(n)); }
@Override public Vector<T> removeAt(int index) { if (isValid(index)) { final Vector<T> begin = take(index); final Vector<T> end = drop(index + 1); return (begin.size() > end.size()) ? begin.appendAll(end) : end.prependAll(begin); } else { throw new IndexOutOfBoundsException("removeAt(" + index + ")"); } }
@Override public Vector<T> insertAll(int index, Iterable<? extends T> elements) { Objects.requireNonNull(elements, "elements is null"); if ((index >= 0) && (index <= length())) { final Vector<T> begin = take(index).appendAll(elements); final Vector<T> end = drop(index); return (begin.size() > end.size()) ? begin.appendAll(end) : end.prependAll(begin); } else { throw new IndexOutOfBoundsException("insert(" + index + ", e) on Vector of length " + length()); } }
@Override public Tuple2<Vector<T>, Vector<T>> splitAtInclusive(Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate is null"); for (int i = 0; i < length(); i++) { final T value = get(i); if (predicate.test(value)) { return (i == (length() - 1)) ? Tuple.of(this, empty()) : Tuple.of(take(i + 1), drop(i + 1)); } } return Tuple.of(this, empty()); }
@Override public Vector<T> slice(int beginIndex, int endIndex) { if ((beginIndex >= endIndex) || (beginIndex >= size()) || isEmpty()) { return empty(); } else if ((beginIndex <= 0) && (endIndex >= length())) { return this; } else { return take(endIndex).drop(beginIndex); } }
@Override public Vector<T> dropRight(int n) { return take(length() - n); }
@Override public Vector<T> patch(int from, Iterable<? extends T> that, int replaced) { from = Math.max(from, 0); replaced = Math.max(replaced, 0); Vector<T> result = take(from).appendAll(that); from += replaced; result = result.appendAll(drop(from)); return result; }
@Override public Tuple2<Vector<T>, Vector<T>> splitAt(int n) { return Tuple.of(take(n), drop(n)); }
@Override public Vector<T> removeAt(int index) { if (isValid(index)) { final Vector<T> begin = take(index); final Vector<T> end = drop(index + 1); return (begin.size() > end.size()) ? begin.appendAll(end) : end.prependAll(begin); } else { throw new IndexOutOfBoundsException("removeAt(" + index + ")"); } }
@Override public Vector<T> slice(int beginIndex, int endIndex) { if ((beginIndex >= endIndex) || (beginIndex >= size()) || isEmpty()) { return empty(); } else if ((beginIndex <= 0) && (endIndex >= length())) { return this; } else { return take(endIndex).drop(beginIndex); } }
@Override public Tuple2<Vector<T>, Vector<T>> splitAtInclusive(Predicate<? super T> predicate) { Objects.requireNonNull(predicate, "predicate is null"); for (int i = 0; i < length(); i++) { final T value = get(i); if (predicate.test(value)) { return (i == (length() - 1)) ? Tuple.of(this, empty()) : Tuple.of(take(i + 1), drop(i + 1)); } } return Tuple.of(this, empty()); }
@Override public Vector<T> insertAll(int index, Iterable<? extends T> elements) { Objects.requireNonNull(elements, "elements is null"); if ((index >= 0) && (index <= length())) { final Vector<T> begin = take(index).appendAll(elements); final Vector<T> end = drop(index); return (begin.size() > end.size()) ? begin.appendAll(end) : end.prependAll(begin); } else { throw new IndexOutOfBoundsException("insert(" + index + ", e) on Vector of length " + length()); } }