Last active
July 4, 2016 22:33
-
-
Save kingreza/1c89be2c7b363668b5c3a1e83abc921a to your computer and use it in GitHub Desktop.
SequenceType in Swift: Even numbers, Powers of two, Fibonacci and Prime numbers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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