@Override public Vector<Vector<T>> permutations() { if (isEmpty()) { return Vector.empty(); } else { final Vector<T> tail = tail(); if (tail.isEmpty()) { return Vector.of(this); } else { final Vector<Vector<T>> zero = empty(); // TODO: IntelliJ IDEA 14.1.1 needs a redundant cast here, jdk 1.8.0_40 compiles fine return distinct() .foldLeft( zero, (xs, x) -> xs.appendAll( remove(x) .permutations() .map((Function<Vector<T>, Vector<T>>) l -> l.prepend(x)))); } } }
@Override public boolean equals(Object o) { if (o == this) { return true; } else if (o instanceof Vector) { Vector<?> vector1 = this; Vector<?> vector2 = (Vector<?>) o; while (!vector1.isEmpty() && !vector2.isEmpty()) { final boolean isEqual = Objects.equals(vector1.head(), vector2.head()); if (!isEqual) { return false; } vector1 = vector1.tail(); vector2 = vector2.tail(); } return vector1.isEmpty() && vector2.isEmpty(); } else { return false; } }