All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.scravy.bedrock.Container Maven / Gradle / Ivy

package de.scravy.bedrock;

import javax.annotation.Nonnull;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import static de.scravy.bedrock.Functions.curry;
import static de.scravy.bedrock.Functions.predicate;

@FunctionalInterface
public interface Container extends ExtendedIterable {

  default boolean isEmpty() {
    return !iterator().hasNext();
  }

  default boolean nonEmpty() {
    return !isEmpty();
  }

  @Nonnull
  default String asString() {
    final StringBuilder b = new StringBuilder();
    forEach(b::append);
    return b.toString();
  }

  @Nonnull
  default String asString(@Nonnull final String delimiter) {
    return stream().map(Objects::toString).collect(Collectors.joining(delimiter));
  }

  default E draw(@Nonnull final Random random) throws NoSuchElementException {
    if (isEmpty()) {
      throw new NoSuchElementException();
    }
    return Seq.ofCollectionInternal(toList()).draw(random);
  }

  default E draw() throws NoSuchElementException {
    return draw(ThreadLocalRandom.current());
  }

  default boolean forAll(@Nonnull final Predicate predicate) {
    Objects.requireNonNull(predicate, "'predicate' must not be null");
    for (final E e : this) {
      if (!predicate.test(e)) {
        return false;
      }
    }
    return true;
  }

  default boolean exists(@Nonnull final Predicate predicate) {
    Objects.requireNonNull(predicate, "'predicate' must not be null");
    for (final E e : this) {
      if (predicate.test(e)) {
        return true;
      }
    }
    return false;
  }

  default boolean contains(final E element) {
    return exists(predicate(curry(Objects::equals).apply(element)));
  }

  @Nonnull
  default Stream stream() {
    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator(), 0), false);
  }

  @Nonnull
  default List toList() {
    final List list = new ArrayList<>();
    for (final E e : this) {
      list.add(e);
    }
    return list;
  }

  static  Container fromIterable(final Iterable e) {
    return e::iterator;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy