package com.googlecode.totallylazy.collections; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.Sequences; import com.googlecode.totallylazy.Unchecked; import java.lang.reflect.Array; import java.util.Collection; import static com.googlecode.totallylazy.functions.Callables.asHashCode; import static com.googlecode.totallylazy.predicates.Predicates.in; import static com.googlecode.totallylazy.predicates.Predicates.not; import static com.googlecode.totallylazy.Sequences.sequence; public abstract class AbstractCollection<T> extends ReadOnlyCollection<T> implements PersistentCollection<T> { @Override public Sequence<T> toSequence() { return sequence(this); } @Override public T[] toArray(final Class<?> aClass) { return toArray(Unchecked.<T[]>cast(Array.newInstance(aClass, 0))); } @Override public Object[] toArray() { return toSequence().toList().toArray(); } @Override public <R> R[] toArray(R[] a) { return toSequence().toList().toArray(a); } @Override public boolean containsAll(Collection<?> c) { return toSequence().containsAll(c); } @Override public String toString() { return appendTo(new StringBuilder(), "(", ",", ")").toString(); } public String toString(final String separator) { return appendTo(new StringBuilder(), separator).toString(); } public String toString(final String start, final String separator, final String end) { return appendTo(new StringBuilder(), start, separator, end).toString(); } public <A extends Appendable> A appendTo(A appendable) { return Sequences.appendTo(this, appendable); } public <A extends Appendable> A appendTo(A appendable, final String separator) { return Sequences.appendTo(this, appendable, separator); } public <A extends Appendable> A appendTo(A appendable, final String start, final String separator, final String end) { return Sequences.appendTo(this, appendable,start, separator, end); } @Override public boolean equals(Object other) { return other instanceof AbstractCollection && toSequence().equals(other); } // Thread-safe Racy Single Check Idiom (Effective Java 2nd Edition p.284) private int hashCode; @Override public int hashCode() { if (hashCode == 0) { hashCode = toSequence().fold(31, asHashCode()); } return hashCode; } }