regarding performance the following version
last(reduce((s,c)->(c[1]>.5 && c[2]<s[2]) ? (s[1]+1,c[2],s[1]+1) : (s[1]+1, s[2],s[3]), data, init=(0,Inf,0)))
seems to rival even a for loop form
julia> @btime last(reduce((s,c)->(c[1]>.5 && c[2]<s[2]) ? (s[1]+1,c[2],s[1]+1) : (s[1]+1, s[2],s[3]), $data, init=(0,Inf,0)))
10.000 ns (0 allocations: 0 bytes)
3
julia> @btime argmin(i -> filterdata($data[i]) ? dataobjective($data[i]) : +Inf, axes($data,1))
23.370 ns (0 allocations: 0 bytes)
3
julia> data = [(rand(rng), rand(rng)) for _ in 1:10^6];
julia> @btime argmin(i -> first($data[i])>0.5 ? last($data[i]) : +Inf, axes($data,1))
4.612 ms (0 allocations: 0 bytes)
669781
julia> @btime last(reduce((s,c)->(c[1]>.5 && c[2]<s[2]) ? (s[1]+1,c[2],s[1]+1) : (s[1]+1, s[2],s[3]), $data, init=(0,Inf,0)))
1.784 ms (0 allocations: 0 bytes)
669781
julia> @btime argmin(i -> filterdata($data[i]) ? dataobjective($data[i]) : +Inf, axes($data,1))
4.668 ms (0 allocations: 0 bytes)
669781
function ffm(arr)
i,im, min=0, 0, Inf
for e in arr
i+=1
if e[1]>.5 && e[2]<min
im, min = i, e[2]
end
end
im
end
julia> @btime ffm($data)
1.804 ms (0 allocations: 0 bytes)
669781