Skip to content

Instantly share code, notes, and snippets.

@nsomar
Created August 6, 2014 23:46
Show Gist options
  • Save nsomar/df877678161976b9e553 to your computer and use it in GitHub Desktop.
Save nsomar/df877678161976b9e553 to your computer and use it in GitHub Desktop.
Implementation of lazy collection in swift
typealias Closure = (Int) -> (Bool)
class MyFilterArrayView: SequenceType, GeneratorType {
var _array: [Int]?
var _lazyFilter: MyFilterArrayView?
var _closure: Closure
var _currentIndex: Int = 0
var array: [Int] {
get {
var retArray = [Int]()
_currentIndex = 0
while let next = next() {
retArray.append(next)
}
_currentIndex = 0
return retArray
}
}
init(arr: [Int], closure: Closure) {
_array = arr
_closure = closure
_lazyFilter = nil
}
init(lazyFilter: MyFilterArrayView, arr: [Int], closure: (Int) -> Bool ) {
_lazyFilter = lazyFilter
_closure = closure
_array = arr
}
func generate() -> MyFilterArrayView {
return self
}
func filterItem(item: Int) -> Int? {
if let lazyFilter = _lazyFilter {
if lazyFilter.filterItem(item) == nil {
return nil
}
}
return _closure(item) ? item : nil
}
func next() -> Int? {
for i in _currentIndex..<_array!.count {
_currentIndex++
if let filtered = filterItem(_array![i]) {
return filtered
}
}
return nil
}
func filter(closure: (Int) -> Bool) -> MyFilterArrayView {
return MyFilterArrayView(lazyFilter: self, arr: _array!, closure: closure)
}
}
struct MyLazyArray: SequenceType {
var _array: [Int]
init(_ arr: [Int]) {
_array = arr
}
func generate() -> IndexingGenerator<[Int]> {
return _array.generate()
}
func filter(closure: Closure) -> MyFilterArrayView {
var w = _array
return MyFilterArrayView(arr: _array, closure: closure)
}
}
var testArray = [1,2,3,3,4,5]
func lazyNativeExample () {
var lazyArray = lazy(testArray)
var lazyFilter = lazyArray.filter{$0 > 2}.filter{$0 < 5}.filter{$0 < 4}
var filteredArray = lazyFilter.array
println(filteredArray)
for item in lazyFilter {
println(item)
}
}
func lazyCustomExample () {
var lazyArray = MyLazyArray(testArray)
var lazyFilter = lazyArray.filter{$0 > 2}.filter{$0 < 5}.filter{$0 < 4}
var filteredArray = lazyFilter.array
println(filteredArray)
for item in lazyFilter {
println(item)
}
}
lazyNativeExample()
lazyCustomExample()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment