Personally I would just use a single array to store the output values because they don't interact with each other. type Vec*[N: static[int], V] = array[N, V] Vec3*[V] = Vec[3, V] var a = Vec3[int]([1, 2, 3]) b = Vec3[int]([-1, 2, 5]) c = Vec3[int]([1, -2, 4]) s = @[a, b, c] proc min[T](vals: varargs[Vec3[T]]): Vec3[T] = result = vals[0] for v in vals: result[0] = min(v[0], result[0]) result[1] = min(v[1], result[1]) result[2] = min(v[2], result[2]) echo min(s) echo min(a, b, c) Run
My main two issues with this is that the first check is redundant, but I'd argue it's ok because it makes the code a bit cleaner. And that I'm not sure that the proc name is what I would use, but that is easily changable.