import jdk.incubator.vector.*;

public class Test {
    private static final VectorSpecies<Integer> SPECIES_I    = IntVector.SPECIES_PREFERRED;

    public static void main(String[] args) {
        int[] a = new int[10_000];
	for (int i = 0; i < a.length; i++) {
	    a[i] = i;
	}

	for (int i = 0; i < 10_000; i++) {
	    findMinIndexI_VectorAPI(a);
	}
    }

    public static int findMinIndexI_VectorAPI(int[] a) {
        // Main approach: have partial results in mins and idxs.
        var mins = IntVector.broadcast(SPECIES_I, a[0]);
        var idxs = IntVector.broadcast(SPECIES_I, 0);
        var iota = IntVector.broadcast(SPECIES_I, 0).addIndex(1);
        int i = 0;
        for (; i < SPECIES_I.loopBound(a.length); i += SPECIES_I.length()) {
            IntVector v = IntVector.fromArray(SPECIES_I, a, i);
            var mask = v.compare(VectorOperators.LT, mins);
            mins = mins.blend(v, mask);
            idxs = idxs.blend(iota, mask);
            iota = iota.add(SPECIES_I.length());
        }
        // Reduce the vectors down
        int min = mins.reduceLanes(VectorOperators.MIN);
        var not_min_mask = mins.compare(VectorOperators.NE, min);
        int index = idxs.blend(a.length, not_min_mask).reduceLanes(VectorOperators.MIN);
        // Tail loop
        for (; i < a.length; i++) {
            int ai = a[i];
            if (ai < min) {
                min = ai;
                index = i;
            }
        }
        return index;
    }
}
