com.github.tonivade.purefun.data.ImmutableSet Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2021, Antonio Gabriel Muñoz Conejo
* Distributed under the terms of the MIT License
*/
package com.github.tonivade.purefun.data;
import static java.util.Collections.unmodifiableSet;
import static java.util.stream.Collectors.collectingAndThen;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.github.tonivade.purefun.Equal;
import com.github.tonivade.purefun.Function1;
import com.github.tonivade.purefun.Kind;
import com.github.tonivade.purefun.Matcher1;
public interface ImmutableSet extends Sequence {
Set toSet();
@Override
ImmutableSet append(E element);
@Override
ImmutableSet remove(E element);
@Override
ImmutableSet appendAll(Sequence extends E> other);
@Override
ImmutableSet removeAll(Sequence extends E> other);
@Override
ImmutableSet reverse();
ImmutableSet union(ImmutableSet extends E> other);
ImmutableSet intersection(ImmutableSet extends E> other);
ImmutableSet difference(ImmutableSet extends E> other);
@Override
default ImmutableSet map(Function1 super E, ? extends R> mapper) {
return ImmutableSet.from(stream().map(mapper::apply));
}
@Override
default ImmutableSet flatMap(Function1 super E, ? extends Kind> mapper) {
return ImmutableSet.from(stream().flatMap(mapper.andThen(SequenceOf::narrowK).andThen(Sequence::stream)::apply));
}
@Override
default ImmutableSet filter(Matcher1 super E> matcher) {
return ImmutableSet.from(stream().filter(matcher::match));
}
@Override
default ImmutableSet filterNot(Matcher1 super E> matcher) {
return filter(matcher.negate());
}
static ImmutableSet from(Iterable extends T> iterable) {
return from(Sequence.asStream(iterable.iterator()));
}
static ImmutableSet from(Stream extends T> stream) {
return new JavaBasedImmutableSet<>(stream.collect(Collectors.toCollection(LinkedHashSet::new)));
}
@SafeVarargs
static ImmutableSet of(T... elements) {
return from(Arrays.stream(elements));
}
@SuppressWarnings("unchecked")
static ImmutableSet empty() {
return (ImmutableSet) JavaBasedImmutableSet.EMPTY;
}
static Collector> toImmutableSet() {
return collectingAndThen(Collectors.toCollection(LinkedHashSet::new), JavaBasedImmutableSet::new);
}
final class JavaBasedImmutableSet implements ImmutableSet, Serializable {
private static final long serialVersionUID = -4111867323115030715L;
public static final ImmutableSet> EMPTY = new JavaBasedImmutableSet<>(new LinkedHashSet<>());
private static final Equal> EQUAL =
Equal.>of().comparing(x -> x.backend);
private final Set backend;
private JavaBasedImmutableSet(LinkedHashSet backend) {
this.backend = unmodifiableSet(backend);
}
@Override
public int size() {
return backend.size();
}
@Override
public boolean contains(E element) {
return backend.contains(element);
}
@Override
public ImmutableSet reverse() {
return this;
}
@Override
public ImmutableSet append(E element) {
LinkedHashSet newSet = copy();
newSet.add(element);
return new JavaBasedImmutableSet<>(newSet);
}
@Override
public ImmutableSet remove(E element) {
LinkedHashSet newSet = copy();
newSet.remove(element);
return new JavaBasedImmutableSet<>(newSet);
}
@Override
public ImmutableSet appendAll(Sequence extends E> other) {
LinkedHashSet newSet = copy();
newSet.addAll(other.toCollection());
return new JavaBasedImmutableSet<>(newSet);
}
@Override
public ImmutableSet removeAll(Sequence extends E> other) {
LinkedHashSet newSet = copy();
newSet.removeAll(other.toCollection());
return new JavaBasedImmutableSet<>(newSet);
}
@Override
public ImmutableSet union(ImmutableSet extends E> other) {
return appendAll(other);
}
@Override
public ImmutableSet intersection(ImmutableSet extends E> other) {
LinkedHashSet newSet = copy();
newSet.retainAll(other.toCollection());
return new JavaBasedImmutableSet<>(newSet);
}
@Override
public ImmutableSet difference(ImmutableSet extends E> other) {
LinkedHashSet newSet = copy();
newSet.removeAll(other.toCollection());
return new JavaBasedImmutableSet<>(newSet);
}
@Override
public Iterator iterator() {
return backend.iterator();
}
@Override
public Set toSet() {
return copy();
}
@Override
public int hashCode() {
return Objects.hash(backend);
}
@Override
public boolean equals(Object obj) {
return EQUAL.applyTo(this, obj);
}
@Override
public String toString() {
return "ImmutableSet(" + backend + ")";
}
private LinkedHashSet copy() {
return new LinkedHashSet<>(backend);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy