(much easier to unroll when `size()` doesn't need to be recomputed every iteration)