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

com.simplaex.bedrock.SeqGenerated Maven / Gradle / Ivy

package com.simplaex.bedrock;

import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import java.util.Comparator;
import java.util.NoSuchElementException;
import java.util.function.IntFunction;

class SeqGenerated extends Seq {

  private final IntFunction backingFunction;
  private final int length;
  private SeqSimple materializedSeq = null;

  SeqGenerated(@Nonnull final IntFunction function, @Nonnegative final int length) {
    this.backingFunction = function;
    this.length = length;
  }

  private void materialize() {
    if (materializedSeq == null) {
      final Object[] array = new Object[length];
      for (int i = 0; i < length; i += 1) {
        array[i] = backingFunction.apply(i);
      }
      materializedSeq = Seq.ofArrayZeroCopyInternal(array);
    }
  }

  @Override
  public E get(@Nonnegative final int index) {
    if (index >= length) {
      throw new IndexOutOfBoundsException();
    }
    return backingFunction.apply(index);
  }

  @Nonnull
  @Override
  public Seq sortedBy(@Nonnull final Comparator comparator) {
    materialize();
    return materializedSeq.sortedBy(comparator);
  }

  @Nonnull
  @Override
  public E[] toArray(@Nonnull final Class clazz) {
    materialize();
    return materializedSeq.toArray(clazz);
  }

  @Nonnull
  @Override
  public Object[] toArray() {
    materialize();
    return materializedSeq.toArray();
  }

  @Override
  public int length() {
    return length;
  }

  @Nonnull
  @Override
  public Seq reversed() {
    materialize();
    return materializedSeq.reversed();
  }

  @SuppressWarnings("unchecked")
  @Nonnull
  @Override
  public Seq sorted() {
    materialize();
    return materializedSeq.sortedInternal();
  }

  @Nonnull
  @Override
  public Seq trimmedToSize() {
    materialize();
    return materializedSeq.trimmedToSize();
  }

  @Nonnull
  @Override
  public Seq subSequence(final int beginOffset, final int endOffset) {
    materialize();
    return materializedSeq.subSequence(beginOffset, endOffset);
  }

  @Nonnull
  @Override
  public Seq subSequenceView(final int beginOffset, final int endOffset) {
    materialize();
    return materializedSeq.subSequenceView(beginOffset, endOffset);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy