Skip to content

Instantly share code, notes, and snippets.

@jarsen
Created September 5, 2014 19:42
Show Gist options
  • Save jarsen/cb50f31a879e530dd7dd to your computer and use it in GitHub Desktop.
Save jarsen/cb50f31a879e530dd7dd to your computer and use it in GitHub Desktop.
infinite sequences via generators & take
class EvenNaturalNumbers: SequenceType {
typealias GeneratorType = EvenNaturalNumbersGenerator
func generate() -> EvenNaturalNumbersGenerator {
return EvenNaturalNumbersGenerator()
}
}
class EvenNaturalNumbersGenerator : GeneratorType {
var current = 2
typealias Element = Int
func next() -> Int? {
let ret = current
current += 2
return ret
}
}
class Fibonacci : SequenceType {
typealias GeneratorType = FibonacciGenerator
func generate() -> FibonacciGenerator {
return FibonacciGenerator()
}
}
class FibonacciGenerator : GeneratorType {
var current = 0, nextValue = 1
typealias Element = Int
func next() -> Int? {
let ret = current
current = nextValue
nextValue = nextValue + ret
return ret
}
}
func take<T, S : SequenceType where S.Generator.Element == T>(n: Int, sequence: S) -> [T] {
var gen = sequence.generate()
var values = [T]()
for _ in (1...n) {
if let value = gen.next() {
values.append(value)
}
}
return values
}
take(5, [1,2,5,12,31,4,2])
take(10, EvenNaturalNumbers())
take(10, Fibonacci())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment