protected SetBase<T> setFeature(C.Feature feature) { features_().add(feature); return this; }
@Override public SetBase<T> accept($.Visitor<? super T> visitor) { return forEach(visitor); }
protected final EnumSet<C.Feature> features_() { if (null == features_) { synchronized (this) { if (null == features_) { features_ = initFeatures(); assert(null != features_); } } } return features_; }
protected final boolean isMutable() { return !isImmutable() && !isReadOnly(); }
@Override public <R> C.Traversable<R> map($.Function<? super T, ? extends R> mapper) { boolean immutable = isImmutable(); int sz = size(); if (immutable) { if (0 == sz) { return Nil.set(); } ListBuilder<R> lb = new ListBuilder<>(sz); forEach($.visitor($.f1(mapper).andThen(C.F.addTo(lb)))); return lb.toList(); } else { if (0 == sz) { return C.newSet(); } C.List<R> l = C.newSizedList(sz); forEach($.visitor($.f1(mapper).andThen(C.F.addTo(l)))); return l; } }
@Override public C.Set<T> withIn(Collection<? extends T> col) { C.Set<T> others = C.newSet(col); others.retainAll(this); if (isImmutable()) { return ImmutableSet.of(others); } return others; }
protected final boolean isReadOnly() { return is(C.Feature.READONLY); }
@Override public C.Set<T> sequential() { unsetFeature(C.Feature.PARALLEL); return this; }
@Override public C.Set<T> parallel() { setFeature(C.Feature.PARALLEL); return this; }
@Override public C.Set<T> filter($.Function<? super T, Boolean> predicate) { boolean immutable = isImmutable(); int sz = size(); // TODO: handle lazy filter if (immutable) { if (0 == sz) { return Nil.set(); } ListBuilder<T> lb = new ListBuilder<T>(sz); forEach($.visitor($.predicate(predicate).ifThen(C.F.addTo(lb)))); return lb.toSet(); } else { if (0 == sz) { return C.newSet(); } C.Set<T> set = C.newSet(); forEach($.visitor($.predicate(predicate).ifThen(C.F.addTo(set)))); return set; } }
@Override public C.Set<T> onlyIn(Collection<? extends T> col) { C.Set<T> others = C.newSet(col); others.removeAll(this); if (isImmutable()) { return ImmutableSet.of(others); } return others; }
protected final boolean isMutable() { return !isImmutable() && !isReadOnly(); }
protected final boolean isImmutable() { return is(C.Feature.IMMUTABLE); }
@Override public C.Set<T> sequential() { unsetFeature(C.Feature.PARALLEL); return this; }
@Override public C.Set<T> lazy() { setFeature(C.Feature.LAZY); return this; }
@Override public <R> C.Traversable<R> map($.Function<? super T, ? extends R> mapper) { boolean immutable = isImmutable(); int sz = size(); if (immutable) { if (0 == sz) { return Nil.set(); } ListBuilder<R> lb = new ListBuilder<>(sz); forEach($.visitor($.f1(mapper).andThen(C.F.addTo(lb)))); return lb.toList(); } else { if (0 == sz) { return C.newSet(); } C.List<R> l = C.newSizedList(sz); forEach($.visitor($.f1(mapper).andThen(C.F.addTo(l)))); return l; } }
@Override public C.Set<T> without(Collection<? super T> col) { C.Set<T> copy = C.newSet(this); copy.removeAll(col); if (isImmutable()) { return ImmutableSet.of(copy); } return copy; }
protected SetBase<T> unsetFeature(C.Feature feature) { features_().remove(feature); return this; }
protected final boolean isLazy() { return is(C.Feature.LAZY); }
@Override public C.Set<T> eager() { unsetFeature(C.Feature.LAZY); return this; }