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

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

package com.simplaex.bedrock;

import lombok.*;

import javax.annotation.Nonnull;
import java.util.Objects;
import java.util.function.DoubleUnaryOperator;
import java.util.function.Function;
import java.util.function.IntUnaryOperator;
import java.util.function.LongUnaryOperator;

@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public abstract class Box {

  public abstract T getValue();

  public abstract void setValue(T value);

  public T apply(@Nonnull final Function function) {
    Objects.requireNonNull(function, "'function' must not be null.");
    setValue(function.apply(getValue()));
    return getValue();
  }

  @Nonnull
  public static  Box box(final T value) {
    return new AnyBox<>(value);
  }

  @Nonnull
  public static  Box box() {
    return new AnyBox<>(null);
  }

  @Nonnull
  public static IntBox intBox(final int value) {
    return new IntBox(value);
  }

  @Nonnull
  public static LongBox longBox(final long value) {
    return new LongBox(value);
  }

  @Nonnull
  public static DoubleBox doubleBox(final double value) {
    return new DoubleBox(value);
  }

  @EqualsAndHashCode(callSuper = false)
  @Data
  @AllArgsConstructor(access = AccessLevel.PRIVATE)
  private static class AnyBox extends Box {

    private T value;

  }

  @EqualsAndHashCode(callSuper = false)
  @AllArgsConstructor(access = AccessLevel.PRIVATE)
  public static class IntBox extends Box {

    private int intValue;

    @Nonnull
    @Override
    public Integer getValue() {
      return intValue;
    }

    @Override
    public void setValue(@Nonnull final Integer value) {
      intValue = value;
    }

    public int update(@Nonnull final IntUnaryOperator function) {
      intValue = function.applyAsInt(intValue);
      return intValue;
    }
  }

  @EqualsAndHashCode(callSuper = false)
  @AllArgsConstructor(access = AccessLevel.PRIVATE)
  public static class LongBox extends Box {

    private long longValue;

    @Nonnull
    @Override
    public Long getValue() {
      return longValue;
    }

    @Override
    public void setValue(@Nonnull final Long value) {
      longValue = value;
    }

    public long update(@Nonnull final LongUnaryOperator function) {
      longValue = function.applyAsLong(longValue);
      return longValue;
    }
  }

  @EqualsAndHashCode(callSuper = false)
  @AllArgsConstructor(access = AccessLevel.PRIVATE)
  public static class DoubleBox extends Box {

    private double doubleValue;

    @Nonnull
    @Override
    public Double getValue() {
      return doubleValue;
    }

    @Override
    public void setValue(@Nonnull final Double value) {
      doubleValue = value;
    }

    public double update(@Nonnull final DoubleUnaryOperator function) {
      doubleValue = function.applyAsDouble(doubleValue);
      return doubleValue;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy