[swift-users] 2 x lazy collection bugs

Howard Lovatt howard.lovatt at gmail.com
Mon Feb 8 22:56:44 CST 2016

```Hi,

I think I have found a couple of bugs in lazy collections; just checking
before filling. The following code is a filter map version of the Sieve of
Eratosthenes:

func lazyFilterMapForEachLoop(limit: Int = 9) -> [Int] {

var possibles = Array(count: limit + 1, repeatedValue: true)

return (2 ... limit).lazy.filter { i in // Has to be lazy and
sequential so that `possibles` is updated before it is used

print("i BF: \(i)")

return possibles[i]

}.map { i in

print("i AF: \(i)")

(i * i).stride(through: limit, by: i).forEach { j in

possibles[j] = false

}

return i

}

}

It produces for a limit of 9:

*i BF: 2*

*i BF: 3*

*i BF: 4*

*i BF: 5*

*i BF: 6*

*i BF: 7*

*i BF: 8*

*i BF: 9*

*i BF: 2*

*i AF: 2*

*i BF: 3*

*i AF: 3*

*i BF: 4*

*i BF: 5*

*i AF: 5*

*i BF: 6*

*i BF: 7*

*i AF: 7*

*i BF: 8*

*i BF: 9*

*fatal error: Index out of range*

1. The filter closure is called twice per trial integer! First without
preceding to the map stage at all, i.e. all values are filtered out! Second
time through the numbers it does proceed to the map stage as you would
expect.
2. It produces an "Index out of range" error despite the fact that
maximum number processed is 9 which is an allowable index of `possibles`.

Is this a couple of bugs or have I misunderstood something?