Skip to content

Instantly share code, notes, and snippets.

@russbishop
Last active August 29, 2015 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save russbishop/d4fe88fe9d11e9ced99a to your computer and use it in GitHub Desktop.
Save russbishop/d4fe88fe9d11e9ced99a to your computer and use it in GitHub Desktop.
Proof that a lazy sequence is a stream and is only iterated once even with two filters
var sequencePoint: Int32 = 0
func printSequencePoint(context: String) {
print("\(context): \(OSAtomicIncrement32(&sequencePoint))")
}
var g = (0..<10).generate()
let seq = lazy(AnySequence(anyGenerator { _ -> Int? in
printSequencePoint("generator")
return g.next()
}))
.filter { printSequencePoint("filter #1"); return $0 != 2 }
.filter { printSequencePoint("filter #2"); return $0 != 4 }
for x in seq {
printSequencePoint("loop")
print("item: \(x)")
}
generator: 1
filter #1: 2
filter #2: 3
loop: 4
item: 0
generator: 5
filter #1: 6
filter #2: 7
loop: 8
item: 1
generator: 9
filter #1: 10
generator: 11
filter #1: 12
filter #2: 13
loop: 14
item: 3
generator: 15
filter #1: 16
filter #2: 17
generator: 18
filter #1: 19
filter #2: 20
loop: 21
item: 5
generator: 22
filter #1: 23
filter #2: 24
loop: 25
item: 6
generator: 26
filter #1: 27
filter #2: 28
loop: 29
item: 7
generator: 30
filter #1: 31
filter #2: 32
loop: 33
item: 8
generator: 34
filter #1: 35
filter #2: 36
loop: 37
item: 9
generator: 38
Program ended with exit code: 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment