com.github.tonivade.purefun.data.ImmutableTree Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2019, Antonio Gabriel Muñoz Conejo
* Distributed under the terms of the MIT License
*/
package com.github.tonivade.purefun.data;
import static java.util.Collections.emptyNavigableSet;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Iterator;
import java.util.NavigableSet;
import java.util.Objects;
import java.util.TreeSet;
import java.util.stream.Collector;
import java.util.stream.Stream;
import com.github.tonivade.purefun.Equal;
import com.github.tonivade.purefun.Function1;
import com.github.tonivade.purefun.Matcher1;
import com.github.tonivade.purefun.type.Option;
import com.github.tonivade.purefun.type.Try;
public interface ImmutableTree extends Sequence {
NavigableSet toNavigableSet();
@Override
ImmutableTree append(E element);
@Override
ImmutableTree remove(E element);
@Override
ImmutableTree appendAll(Sequence other);
@Override
ImmutableTree removeAll(Sequence other);
@Override
ImmutableTree reverse();
Option head();
Option tail();
ImmutableTree headTree(E value);
ImmutableTree tailTree(E value);
Option higher(E value);
Option lower(E value);
Option ceiling(E value);
Option floor(E value);
@Override
default ImmutableTree map(Function1 mapper) {
return ImmutableTree.from(stream().map(mapper::apply));
}
@Override
default ImmutableTree flatMap(Function1> mapper) {
return ImmutableTree.from(stream().flatMap(element -> mapper.apply(element).stream()));
}
@Override
default ImmutableTree filter(Matcher1 matcher) {
return ImmutableTree.from(stream().filter(matcher::match));
}
static ImmutableTree from(Iterable iterable) {
return from(Sequence.asStream(iterable.iterator()));
}
static ImmutableTree from(Stream stream) {
return new JavaBasedImmutableTree<>(stream.collect(toCollection(TreeSet::new)));
}
@SafeVarargs
static ImmutableTree of(T... elements) {
return new JavaBasedImmutableTree<>(new TreeSet<>(Arrays.asList(elements)));
}
static ImmutableTree empty() {
return new JavaBasedImmutableTree<>(emptyNavigableSet());
}
static Collector> toImmutableTree() {
return collectingAndThen(toCollection(TreeSet::new), JavaBasedImmutableTree::new);
}
final class JavaBasedImmutableTree implements ImmutableTree, Serializable {
private static final long serialVersionUID = -328223831102407507L;
private final NavigableSet backend;
private JavaBasedImmutableTree(NavigableSet backend) {
this.backend = requireNonNull(backend);
}
@Override
public int size() {
return backend.size();
}
@Override
public boolean contains(E element) {
return backend.contains(element);
}
@Override
public ImmutableTree reverse() {
return this;
}
@Override
public ImmutableTree append(E element) {
NavigableSet newSet = toNavigableSet();
newSet.add(element);
return new JavaBasedImmutableTree<>(newSet);
}
@Override
public ImmutableTree remove(E element) {
NavigableSet newSet = toNavigableSet();
newSet.remove(element);
return new JavaBasedImmutableTree<>(newSet);
}
@Override
public ImmutableTree appendAll(Sequence other) {
NavigableSet newSet = toNavigableSet();
for (E element : other) {
newSet.add(element);
}
return new JavaBasedImmutableTree<>(newSet);
}
@Override
public ImmutableTree removeAll(Sequence other) {
NavigableSet newSet = toNavigableSet();
for (E element : other) {
newSet.remove(element);
}
return new JavaBasedImmutableTree<>(newSet);
}
@Override
public Option head() {
return Try.of(backend::first).toOption();
}
@Override
public Option tail() {
return Try.of(backend::last).toOption();
}
@Override
public ImmutableTree headTree(E toElement) {
return new JavaBasedImmutableTree<>(backend.headSet(toElement, false));
}
@Override
public ImmutableTree tailTree(E fromElement) {
return new JavaBasedImmutableTree<>(backend.tailSet(fromElement, false));
}
@Override
public Option higher(E value) {
return Option.of(() -> backend.higher(value));
}
@Override
public Option lower(E value) {
return Option.of(() -> backend.lower(value));
}
@Override
public Option ceiling(E value) {
return Option.of(() -> backend.ceiling(value));
}
@Override
public Option floor(E value) {
return Option.of(() -> backend.floor(value));
}
@Override
public Iterator iterator() {
return backend.iterator();
}
@Override
public NavigableSet toNavigableSet() {
return new TreeSet<>(backend);
}
@Override
public int hashCode() {
return Objects.hash(backend);
}
@Override
public boolean equals(Object obj) {
return Equal.of(this)
.append((a, b) -> Objects.equals(a.backend, b.backend))
.applyTo(obj);
}
@Override
public String toString() {
return "ImmutableTree(" + backend + ")";
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy