// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/Builder.java
// public interface Builder<E, R> {
//     @NotNull
//     Builder<E, R> add(E element);
// 
//     @NotNull
//     Builder<E, R> addAll(@NotNull Traversable<E> elements);
// 
//     @NotNull
//     Builder<E, R> addAll(@NotNull java.lang.Iterable<E> elements);
// 
//     @NotNull
//     Builder<E, R> addAll(@NotNull Iterator<E> iterator);
// 
//     @NotNull
//     Builder<E, R> addAll(E e1, E e2, E... es);
// 
//     @NotNull
//     R build();
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/BuilderFactory.java
// public interface BuilderFactory<E, R> {
//     @NotNull
//     Builder<E, R> newBuilder();
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/Set.java
// public interface Set<E> extends Iterable<E> {
//     /**
//      * Returns a set that adds the specified value if it doesn't already exist in this set.
//      */
//     @NotNull
//     Set<E> add(E value);
// 
//     /**
//      * Removes the specified value from the set if it exists.
//      */
//     @NotNull
//     Set<E> remove(E value);
// 
//     /**
//      * Returns true if the value exists in this set.
//      */
//     boolean contains(E value);
// 
//     /**
//      * Returns an immutable view of this set as an instance of {@code java.util.Set}.
//      */
//     @NotNull
//     java.util.Set<E> asSet();
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/internal/base/AbstractSet.java
// public abstract class AbstractSet<E> extends AbstractIterable<E> implements Set<E> {
//     @Override
//     @SuppressWarnings("unchecked")
//     public boolean equals(Object o) {
//         if (o == this)
//             return true;
// 
//         if (!(o instanceof Set))
//             return false;
// 
//         final Set other = (Set) o;
//         if (other.size() != size())
//             return false;
// 
//         for (E a : this) {
//             try {
//                 if (!other.contains(a)) {
//                     return false;
//                 }
//             } catch (NullPointerException e) {
//                 return false;
//             } catch (ClassCastException e) {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         int hashCode = 0;
//         for (E e : this) {
//             hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
//         }
// 
//         return hashCode;
//     }
// 
//     @Override
//     @NotNull
//     public java.util.Set<E> asSet() {
//         return new SetAdapater<E>(this);
//     }
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/internal/builder/AbstractBuilder.java
// public abstract class AbstractBuilder<E, R> implements Builder<E, R> {
//     private boolean built = false;
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(@NotNull Traversable<E> elements) {
//         elements.forEach(new Function<E, Object>() {
//             @Override
//             public Object invoke(E element) {
//                 add(element);
//                 return null;
//             }
//         });
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(@NotNull Iterable<E> elements) {
//         for (E element : elements) {
//             add(element);
//         }
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(@NotNull Iterator<E> iterator) {
//         while (iterator.hasNext()) {
//             add(iterator.next());
//         }
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(E e1, E e2, E... es) {
//         add(e1);
//         add(e2);
//         for (E e : es) {
//             add(e);
//         }
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     final public R build() {
//         if (built) throw new IllegalStateException("Builders do not support multiple calls to build()");
//         built = true;
//         return doBuild();
//     }
// 
//     @NotNull
//     public abstract R doBuild();
// }


import java.util.Iterator;
import com.github.andrewoma.dexx.collection.Builder;
import com.github.andrewoma.dexx.collection.BuilderFactory;
import com.github.andrewoma.dexx.collection.Set;
import com.github.andrewoma.dexx.collection.internal.base.AbstractSet;
import com.github.andrewoma.dexx.collection.internal.builder.AbstractBuilder;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
    }

    @NotNull
    @Override
    public Set<A> remove(A value) {
        underlying.remove(value);
        return this;
    }

    @Override
    public int size() {
        return underlying.size();
    }

    @Override
    public boolean contains(A value) {
        return underlying.contains(value);
    }

    @NotNull
    @Override
    public Iterator<A> iterator() {
        return underlying.iterator();
    }

    static class MutableHashSetBuilder<A> extends AbstractBuilder<A, Set<A>> implements Builder<A, Set<A>> {
        private java.util.Set<A> result = new HashSet<A>();

        @NotNull
        @Override
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/Builder.java
// public interface Builder<E, R> {
//     @NotNull
//     Builder<E, R> add(E element);
// 
//     @NotNull
//     Builder<E, R> addAll(@NotNull Traversable<E> elements);
// 
//     @NotNull
//     Builder<E, R> addAll(@NotNull java.lang.Iterable<E> elements);
// 
//     @NotNull
//     Builder<E, R> addAll(@NotNull Iterator<E> iterator);
// 
//     @NotNull
//     Builder<E, R> addAll(E e1, E e2, E... es);
// 
//     @NotNull
//     R build();
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/BuilderFactory.java
// public interface BuilderFactory<E, R> {
//     @NotNull
//     Builder<E, R> newBuilder();
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/Set.java
// public interface Set<E> extends Iterable<E> {
//     /**
//      * Returns a set that adds the specified value if it doesn't already exist in this set.
//      */
//     @NotNull
//     Set<E> add(E value);
// 
//     /**
//      * Removes the specified value from the set if it exists.
//      */
//     @NotNull
//     Set<E> remove(E value);
// 
//     /**
//      * Returns true if the value exists in this set.
//      */
//     boolean contains(E value);
// 
//     /**
//      * Returns an immutable view of this set as an instance of {@code java.util.Set}.
//      */
//     @NotNull
//     java.util.Set<E> asSet();
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/internal/base/AbstractSet.java
// public abstract class AbstractSet<E> extends AbstractIterable<E> implements Set<E> {
//     @Override
//     @SuppressWarnings("unchecked")
//     public boolean equals(Object o) {
//         if (o == this)
//             return true;
// 
//         if (!(o instanceof Set))
//             return false;
// 
//         final Set other = (Set) o;
//         if (other.size() != size())
//             return false;
// 
//         for (E a : this) {
//             try {
//                 if (!other.contains(a)) {
//                     return false;
//                 }
//             } catch (NullPointerException e) {
//                 return false;
//             } catch (ClassCastException e) {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         int hashCode = 0;
//         for (E e : this) {
//             hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
//         }
// 
//         return hashCode;
//     }
// 
//     @Override
//     @NotNull
//     public java.util.Set<E> asSet() {
//         return new SetAdapater<E>(this);
//     }
// }
// 
// Path: collection/src/main/java/com/github/andrewoma/dexx/collection/internal/builder/AbstractBuilder.java
// public abstract class AbstractBuilder<E, R> implements Builder<E, R> {
//     private boolean built = false;
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(@NotNull Traversable<E> elements) {
//         elements.forEach(new Function<E, Object>() {
//             @Override
//             public Object invoke(E element) {
//                 add(element);
//                 return null;
//             }
//         });
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(@NotNull Iterable<E> elements) {
//         for (E element : elements) {
//             add(element);
//         }
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(@NotNull Iterator<E> iterator) {
//         while (iterator.hasNext()) {
//             add(iterator.next());
//         }
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     public Builder<E, R> addAll(E e1, E e2, E... es) {
//         add(e1);
//         add(e2);
//         for (E e : es) {
//             add(e);
//         }
//         return this;
//     }
// 
//     @NotNull
//     @Override
//     final public R build() {
//         if (built) throw new IllegalStateException("Builders do not support multiple calls to build()");
//         built = true;
//         return doBuild();
//     }
// 
//     @NotNull
//     public abstract R doBuild();
// }


// Path: collection/src/test/java/com/github/andrewoma/dexx/collection/mutable/MutableHashSet.java
import java.util.Iterator;
import com.github.andrewoma.dexx.collection.Builder;
import com.github.andrewoma.dexx.collection.BuilderFactory;
import com.github.andrewoma.dexx.collection.Set;
import com.github.andrewoma.dexx.collection.internal.base.AbstractSet;
import com.github.andrewoma.dexx.collection.internal.builder.AbstractBuilder;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;

    }

    @NotNull
    @Override
    public Set<A> remove(A value) {
        underlying.remove(value);
        return this;
    }

    @Override
    public int size() {
        return underlying.size();
    }

    @Override
    public boolean contains(A value) {
        return underlying.contains(value);
    }

    @NotNull
    @Override
    public Iterator<A> iterator() {
        return underlying.iterator();
    }

    static class MutableHashSetBuilder<A> extends AbstractBuilder<A, Set<A>> implements Builder<A, Set<A>> {
        private java.util.Set<A> result = new HashSet<A>();

        @NotNull
        @Override
        public Builder<A, Set<A>> add(A element) {