Skip to content

Instantly share code, notes, and snippets.

@kingreza
Last active July 4, 2016 22:33
Show Gist options
  • Save kingreza/1c89be2c7b363668b5c3a1e83abc921a to your computer and use it in GitHub Desktop.
Save kingreza/1c89be2c7b363668b5c3a1e83abc921a to your computer and use it in GitHub Desktop.
SequenceType in Swift: Even numbers, Powers of two, Fibonacci and Prime numbers
//Sequence of positive even numbers
struct Even: SequenceType {
func generate() -> AnyGenerator<Int> {
var _first = 0
return AnyGenerator<Int> {
_first += 2
return _first
}
}
}
//Sequence of powers of two
struct PowersOfTwo: SequenceType {
func generate() -> AnyGenerator<Int> {
var _item: Int = 0
return AnyGenerator<Int> {
_item = _item == 0 ? 1 : _item
_item = _item << 1
return _item
}
}
}
//Sequence of prime numbers
struct PrimeNumbers: SequenceType {
func generate() -> AnyGenerator<Int> {
var _pastPrimes: [Int] = []
var _current: Int = 2
return AnyGenerator<Int> {
if _current == 2 {
_current += 1
return 2
}
var found: Bool = false
var _result: Int = 2
while !found {
guard !(_current % 2 == 0) else {
_current += 1
continue
}
let hits = _pastPrimes.filter {_current % $0 == 0}
guard hits.count == 0 else {
_current += 1
continue
}
_pastPrimes.append(_current)
_result = _current
found = true
_current += 1
}
return _result
}
}
}
//Sequence of Fibonacci numbers
struct Fibonacci: SequenceType {
func generate() -> AnyGenerator<Int> {
var _last: Int = 1
var _laster: Int = 1
var _count: Int = 0
var _result: Int = 0
return AnyGenerator {
_count += 1
guard _count != 1 else {
return _laster
}
guard _count != 2 else {
return _last
}
_result = _last + _laster
_laster = _last
_last = _result
return _result
}
}
}
var even = Even().generate()
for _ in 0..<200 {
if let val = even.next(){
print(val)
}
}
var power = PowersOfTwo().generate()
for _ in 0..<10 {
if let val = power.next(){
print(val)
}
}
var fibo = Fibonacci().generate()
for _ in 0..<50 {
if let val = fibo.next(){
print(val)
}
}
var prime = PrimeNumbers().generate()
for _ in 0..<200 {
if let val = prime.next(){
print(val)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment