|
package flatten; |
|
|
|
import java.util.Arrays; |
|
import java.util.Optional; |
|
import java.util.OptionalInt; |
|
import java.util.function.Function; |
|
import java.util.function.IntFunction; |
|
import java.util.stream.IntStream; |
|
|
|
public class ArrayOrInt { |
|
private final Optional<ArrayOrInt[]> array; |
|
private final OptionalInt integer; |
|
|
|
public ArrayOrInt(Optional<ArrayOrInt[]> array, OptionalInt integer) { |
|
if (!(array.isPresent() ^ integer.isPresent())) { |
|
throw new IllegalArgumentException(); |
|
} |
|
this.array = array; |
|
this.integer = integer; |
|
} |
|
|
|
public static ArrayOrInt of(int value) { |
|
return new ArrayOrInt(Optional.empty(), OptionalInt.of(value)); |
|
} |
|
|
|
public static ArrayOrInt of(int... values) { |
|
ArrayOrInt[] objects = IntStream.of(values).mapToObj(ArrayOrInt::of).toArray(ArrayOrInt[]::new); |
|
return ArrayOrInt.of(objects); |
|
} |
|
|
|
public static ArrayOrInt of(ArrayOrInt... values) { |
|
return new ArrayOrInt(Optional.of(values), OptionalInt.empty()); |
|
} |
|
|
|
public <T> T map(Function<ArrayOrInt[], T> ifArray, IntFunction<T> ifInt) { |
|
return array.map(ifArray).orElseGet(() -> ifInt.apply(integer.getAsInt())); |
|
} |
|
|
|
@Override |
|
public String toString() { |
|
return map(Arrays::toString, Integer::toString); |
|
} |
|
} |