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

name.remal.ArrayUtils Maven / Gradle / Ivy

package name.remal;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Contract;
import java.util.Arrays;
import java.lang.reflect.Array;
import java.util.Objects;
import static name.remal.UncheckedCast.uncheckedCast;
@SuppressWarnings("SimplifiableIfStatement")
public class ArrayUtils {

    @NotNull
    @Contract(pure = true)
    static boolean[] concatArray(@NotNull boolean[] array1, @NotNull boolean[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        boolean[] result = new boolean[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static boolean[] concat(@NotNull boolean[] array1, @NotNull boolean... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static byte[] concatArray(@NotNull byte[] array1, @NotNull byte[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        byte[] result = new byte[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static byte[] concat(@NotNull byte[] array1, @NotNull byte... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static char[] concatArray(@NotNull char[] array1, @NotNull char[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        char[] result = new char[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static char[] concat(@NotNull char[] array1, @NotNull char... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static double[] concatArray(@NotNull double[] array1, @NotNull double[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        double[] result = new double[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static double[] concat(@NotNull double[] array1, @NotNull double... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static float[] concatArray(@NotNull float[] array1, @NotNull float[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        float[] result = new float[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static float[] concat(@NotNull float[] array1, @NotNull float... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static int[] concatArray(@NotNull int[] array1, @NotNull int[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        int[] result = new int[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static int[] concat(@NotNull int[] array1, @NotNull int... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static long[] concatArray(@NotNull long[] array1, @NotNull long[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        long[] result = new long[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static long[] concat(@NotNull long[] array1, @NotNull long... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static short[] concatArray(@NotNull short[] array1, @NotNull short[] array2) {
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        short[] result = new short[array1.length + array2.length];
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @Contract(pure = true)
    public static short[] concat(@NotNull short[] array1, @NotNull short... array2) {
        return concatArray(array1, array2);
    }

    @NotNull
    @Contract(pure = true)
    static  T[] concatArray(@NotNull T[] array1, @NotNull O[] array2) {
        Class type = array1.getClass().getComponentType();
        Class otherType = array2.getClass().getComponentType();
        if (!type.isAssignableFrom(otherType)) throw new IllegalArgumentException("Array of " + type + " can't be concatenated with array of " + otherType);
        if (0 == array1.length) return array2;
        if (0 == array2.length) return array1;
        T[] result = uncheckedCast(Array.newInstance(type, array1.length + array2.length));
        System.arraycopy(array1, 0, result, 0, array1.length);
        System.arraycopy(array2, 0, result, array1.length, array2.length);
        return result;
    }

    @NotNull
    @SafeVarargs
    @Contract(pure = true)
    public static  T[] concat(@NotNull T[] array1, @NotNull O... array2) {
        return concatArray(array1, array2);
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable boolean[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable boolean[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable byte[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable byte[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable char[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable char[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable double[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable double[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable float[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable float[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable int[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable int[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable long[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable long[] array1, @Nullable short[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable boolean[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable byte[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable char[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable double[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable float[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable int[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; _,!null->false; !null,_->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable long[] array2) {
        return array1 == null && null == array2;
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable short[] array1, @Nullable short[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.equals(array1, array2);
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable Object[] array1, @Nullable Object[] array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        return Arrays.deepEquals(array1, array2);
    }

    @Contract(value = "null,null->true; null,!null->false; !null,null->false", pure = true)
    public static boolean arrayEquals(@Nullable Object array1, @Nullable Object array2) {
        if (array1 == array2) return true;
        if (array1 == null || array2 == null) return false;
        if (array1 instanceof boolean[] && array2 instanceof boolean[]) return Arrays.equals((boolean[]) array1, (boolean[]) array2);
        if (array1 instanceof byte[] && array2 instanceof byte[]) return Arrays.equals((byte[]) array1, (byte[]) array2);
        if (array1 instanceof char[] && array2 instanceof char[]) return Arrays.equals((char[]) array1, (char[]) array2);
        if (array1 instanceof double[] && array2 instanceof double[]) return Arrays.equals((double[]) array1, (double[]) array2);
        if (array1 instanceof float[] && array2 instanceof float[]) return Arrays.equals((float[]) array1, (float[]) array2);
        if (array1 instanceof int[] && array2 instanceof int[]) return Arrays.equals((int[]) array1, (int[]) array2);
        if (array1 instanceof long[] && array2 instanceof long[]) return Arrays.equals((long[]) array1, (long[]) array2);
        if (array1 instanceof short[] && array2 instanceof short[]) return Arrays.equals((short[]) array1, (short[]) array2);
        if (array1 instanceof Object[] && array2 instanceof Object[]) return Arrays.deepEquals((Object[]) array1, (Object[]) array2);
        return array1.equals(array2);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable boolean[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable boolean... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable byte[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable byte... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable char[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable char... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable double[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable double... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable float[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable float... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable int[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable int... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable long[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable long... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable short[] array) {
        if (array == null) return 0;
        return Arrays.hashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable short... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    static int arrayHashCodeArray(@Nullable Object[] array) {
        if (array == null) return 0;
        return Arrays.deepHashCode(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable Object... array) {
        return arrayHashCodeArray(array);
    }

    @Contract(pure = true)
    public static int arrayHashCode(@Nullable Object array) {
        if (array == null) return 0;
        if (array instanceof boolean[]) return Arrays.hashCode((boolean[]) array);
        if (array instanceof byte[]) return Arrays.hashCode((byte[]) array);
        if (array instanceof char[]) return Arrays.hashCode((char[]) array);
        if (array instanceof double[]) return Arrays.hashCode((double[]) array);
        if (array instanceof float[]) return Arrays.hashCode((float[]) array);
        if (array instanceof int[]) return Arrays.hashCode((int[]) array);
        if (array instanceof long[]) return Arrays.hashCode((long[]) array);
        if (array instanceof short[]) return Arrays.hashCode((short[]) array);
        if (array instanceof Object[]) return Arrays.deepHashCode((Object[]) array);
        return array.hashCode();
    }


    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable boolean[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable boolean... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable byte[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable byte... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable char[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable char... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable double[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable double... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable float[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable float... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable int[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable int... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable long[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable long... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable short[] array) {
        if (array == null) return "null";
        return Arrays.toString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable short... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    static String arrayToStringArray(@Nullable Object[] array) {
        if (array == null) return "null";
        return Arrays.deepToString(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable Object... array) {
        return arrayToStringArray(array);
    }

    @NotNull
    @Contract(pure = true)
    public static String arrayToString(@Nullable Object array) {
        if (array == null) return "null";
        if (array instanceof boolean[]) return Arrays.toString((boolean[]) array);
        if (array instanceof byte[]) return Arrays.toString((byte[]) array);
        if (array instanceof char[]) return Arrays.toString((char[]) array);
        if (array instanceof double[]) return Arrays.toString((double[]) array);
        if (array instanceof float[]) return Arrays.toString((float[]) array);
        if (array instanceof int[]) return Arrays.toString((int[]) array);
        if (array instanceof long[]) return Arrays.toString((long[]) array);
        if (array instanceof short[]) return Arrays.toString((short[]) array);
        if (array instanceof Object[]) return Arrays.deepToString((Object[]) array);
        return array.toString();
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull boolean[] array, @NotNull boolean[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull boolean[] array, @NotNull boolean... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull byte[] array, @NotNull byte[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull byte[] array, @NotNull byte... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull char[] array, @NotNull char[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull char[] array, @NotNull char... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull double[] array, @NotNull double[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull double[] array, @NotNull double... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull float[] array, @NotNull float[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull float[] array, @NotNull float... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull int[] array, @NotNull int[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull int[] array, @NotNull int... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull long[] array, @NotNull long[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull long[] array, @NotNull long... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@NotNull short[] array, @NotNull short[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (array[i] != other[i]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull short[] array, @NotNull short... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static  boolean startsWithArray(@NotNull T[] array, @NotNull O[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int i = 0; i < other.length; ++i) { if (!arrayEquals(array[i], other[i])) return false; }
        return true;
    }

    @SafeVarargs
    @Contract(pure = true)
    public static  boolean startsWith(@NotNull T[] array, @NotNull O... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull boolean[] array, @NotNull boolean[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull boolean[] array, @NotNull boolean... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull byte[] array, @NotNull byte[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull byte[] array, @NotNull byte... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull char[] array, @NotNull char[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull char[] array, @NotNull char... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull double[] array, @NotNull double[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull double[] array, @NotNull double... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull float[] array, @NotNull float[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull float[] array, @NotNull float... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull int[] array, @NotNull int[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull int[] array, @NotNull int... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull long[] array, @NotNull long[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull long[] array, @NotNull long... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@NotNull short[] array, @NotNull short[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (array[array.length - n] != other[other.length - n]) return false; }
        return true;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull short[] array, @NotNull short... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static  boolean endsWithArray(@NotNull T[] array, @NotNull O[] other) {
        if (0 == other.length) return true;
        if (array.length < other.length) return false;
        for (int n = 1; n <= other.length; ++n) { if (!arrayEquals(array[array.length - n], other[other.length - n])) return false; }
        return true;
    }

    @SafeVarargs
    @Contract(pure = true)
    public static  boolean endsWith(@NotNull T[] array, @NotNull O... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull boolean[] array, @NotNull boolean[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull boolean[] array, @NotNull boolean... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull byte[] array, @NotNull byte[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull byte[] array, @NotNull byte... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull char[] array, @NotNull char[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull char[] array, @NotNull char... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull double[] array, @NotNull double[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull double[] array, @NotNull double... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull float[] array, @NotNull float[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull float[] array, @NotNull float... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull int[] array, @NotNull int[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull int[] array, @NotNull int... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull long[] array, @NotNull long[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull long[] array, @NotNull long... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@NotNull short[] array, @NotNull short[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i + g] != other[g]) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull short[] array, @NotNull short... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static  int indexOfArray(@NotNull T[] array, @NotNull O[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        int maxI = array.length - other.length;
        outer:
        for (int i = 0; i <= maxI; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (!arrayEquals(array[i + g], other[g])) {
                    continue outer;
                }
            }
            return i;
        }
        return -1;
    }

    @SafeVarargs
    @Contract(pure = true)
    public static  int indexOf(@NotNull T[] array, @NotNull O... other) {
        return indexOfArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull boolean[] array, @NotNull boolean[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull boolean[] array, @NotNull boolean... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull byte[] array, @NotNull byte[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull byte[] array, @NotNull byte... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull char[] array, @NotNull char[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull char[] array, @NotNull char... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull double[] array, @NotNull double[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull double[] array, @NotNull double... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull float[] array, @NotNull float[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull float[] array, @NotNull float... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull int[] array, @NotNull int[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull int[] array, @NotNull int... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull long[] array, @NotNull long[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull long[] array, @NotNull long... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static boolean containsArray(@NotNull short[] array, @NotNull short[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull short[] array, @NotNull short... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    static  boolean containsArray(@NotNull T[] array, @NotNull O[] other) {
        return 0 <= indexOfArray(array, other);
    }

    @SafeVarargs
    @Contract(pure = true)
    public static  boolean contains(@NotNull T[] array, @NotNull O... other) {
        return containsArray(array, other);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull boolean[] array, boolean value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull boolean[] array, boolean value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull boolean[] array, boolean value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull boolean[] array, boolean value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull byte[] array, byte value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull byte[] array, byte value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull byte[] array, byte value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull byte[] array, byte value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull char[] array, char value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull char[] array, char value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull char[] array, char value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull char[] array, char value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull double[] array, double value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull double[] array, double value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull double[] array, double value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull double[] array, double value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull float[] array, float value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull float[] array, float value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull float[] array, float value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull float[] array, float value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull int[] array, int value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull int[] array, int value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull int[] array, int value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull int[] array, int value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull long[] array, long value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull long[] array, long value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull long[] array, long value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull long[] array, long value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull short[] array, short value) {
        return 1 <= array.length && array[0] == value;
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull short[] array, short value) {
        return 1 <= array.length && array[array.length - 1] == value;
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull short[] array, short value) {
        for (int i = 0; i < array.length; ++i) {
            if (value == array[i]) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull short[] array, short value) {
        return 0 <= indexOf(array, value);
    }

    @Contract(pure = true)
    public static boolean startsWith(@NotNull Object[] array, @Nullable Object value) {
        return 1 <= array.length && arrayEquals(array[0], value);
    }

    @Contract(pure = true)
    public static boolean endsWith(@NotNull Object[] array, @Nullable Object value) {
        return 1 <= array.length && arrayEquals(array[array.length - 1], value);
    }

    @Contract(pure = true)
    public static int indexOf(@NotNull Object[] array, @Nullable Object value) {
        for (int i = 0; i < array.length; ++i) {
            if (arrayEquals(value, array[i])) return i;
        }
        return -1;
    }

    @Contract(pure = true)
    public static boolean contains(@NotNull Object[] array, @Nullable Object value) {
        return 0 <= indexOf(array, value);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy