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

name.remal.ArrayUtils Maven / Gradle / Ivy

package name.remal;
import javax.annotation.Nonnull;
import javax.annotation.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 {

    @Nonnull
    @Contract(pure = true)
    static boolean[] concatArray(@Nonnull boolean[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static byte[] concatArray(@Nonnull byte[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static char[] concatArray(@Nonnull char[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static double[] concatArray(@Nonnull double[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static float[] concatArray(@Nonnull float[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static int[] concatArray(@Nonnull int[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static long[] concatArray(@Nonnull long[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static short[] concatArray(@Nonnull short[] array1, @Nonnull 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;
    }

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

    @Nonnull
    @Contract(pure = true)
    static  T[] concatArray(@Nonnull T[] array1, @Nonnull 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;
    }

    @Nonnull
    @SafeVarargs
    @Contract(pure = true)
    public static  T[] concat(@Nonnull T[] array1, @Nonnull 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 (null == array1 || null == array2) 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 null == array1 && null == array2;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    @Nonnull
    @Contract(pure = true)
    public static String arrayToString(@Nullable Object array) {
        if (null == array) 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(@Nonnull boolean[] array, @Nonnull 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(@Nonnull boolean[] array, @Nonnull boolean... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull byte[] array, @Nonnull 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(@Nonnull byte[] array, @Nonnull byte... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull char[] array, @Nonnull 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(@Nonnull char[] array, @Nonnull char... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull double[] array, @Nonnull 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(@Nonnull double[] array, @Nonnull double... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull float[] array, @Nonnull 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(@Nonnull float[] array, @Nonnull float... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull int[] array, @Nonnull 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(@Nonnull int[] array, @Nonnull int... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull long[] array, @Nonnull 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(@Nonnull long[] array, @Nonnull long... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean startsWithArray(@Nonnull short[] array, @Nonnull 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(@Nonnull short[] array, @Nonnull short... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static  boolean startsWithArray(@Nonnull T[] array, @Nonnull 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(@Nonnull T[] array, @Nonnull O... other) {
        return startsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull boolean[] array, @Nonnull 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(@Nonnull boolean[] array, @Nonnull boolean... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull byte[] array, @Nonnull 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(@Nonnull byte[] array, @Nonnull byte... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull char[] array, @Nonnull 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(@Nonnull char[] array, @Nonnull char... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull double[] array, @Nonnull 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(@Nonnull double[] array, @Nonnull double... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull float[] array, @Nonnull 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(@Nonnull float[] array, @Nonnull float... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull int[] array, @Nonnull 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(@Nonnull int[] array, @Nonnull int... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull long[] array, @Nonnull 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(@Nonnull long[] array, @Nonnull long... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static boolean endsWithArray(@Nonnull short[] array, @Nonnull 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(@Nonnull short[] array, @Nonnull short... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static  boolean endsWithArray(@Nonnull T[] array, @Nonnull 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(@Nonnull T[] array, @Nonnull O... other) {
        return endsWithArray(array, other);
    }

    @Contract(pure = true)
    static int indexOfArray(@Nonnull boolean[] array, @Nonnull boolean[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull byte[] array, @Nonnull byte[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull char[] array, @Nonnull char[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull double[] array, @Nonnull double[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull float[] array, @Nonnull float[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull int[] array, @Nonnull int[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull long[] array, @Nonnull long[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static int indexOfArray(@Nonnull short[] array, @Nonnull short[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (array[i] == other[g]) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

    @Contract(pure = true)
    static  int indexOfArray(@Nonnull T[] array, @Nonnull O[] other) {
        if (0 == other.length) return 0;
        if (array.length < other.length) return -1;
        for (int i = 0; i < array.length - other.length + 1; ++i) {
            for (int g = 0; g < other.length; ++g) {
                if (arrayEquals(array[i], other[g])) {
                    if (g == other.length - 1) return i;
                } else {
                    break;
                }
            }
        }
        return -1;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull boolean[] array, boolean value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull byte[] array, byte value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull char[] array, char value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull double[] array, double value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull float[] array, float value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull int[] array, int value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull long[] array, long value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull short[] array, short value) {
        return 0 <= indexOf(array, value);
    }

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

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

    @Contract(pure = true)
    public static int indexOf(@Nonnull 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(@Nonnull Object[] array, @Nullable Object value) {
        return 0 <= indexOf(array, value);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy