Created
October 6, 2015 11:47
-
-
Save hermanbanken/d1fa9fca91c52f8ce7de to your computer and use it in GitHub Desktop.
This file contains 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
// | |
// buffer.swift | |
// | |
// Created by H.J. Banken on 06/10/2015. | |
// Copyright (c) 2015 Q42 Internet B.V. All rights reserved. | |
// | |
public class BufferList<T> { | |
private let maker: (Int -> T?) | |
private let offset: Int | |
let length: Int | |
private let bufferSize: Int | |
private var bufferPointers: [Int] = [] | |
private var buffer: [Int:T?] = [:] | |
public init(maker: (Int -> T?), length:Int, offset:Int = 0, bufferSize: Int = -1){ | |
self.maker = maker | |
self.offset = offset | |
self.length = length | |
self.bufferSize = bufferSize | |
} | |
public func map<V>(mapper:T->V)->BufferList<V> { | |
return BufferList<V>( | |
maker: { index in | |
if let outer = self[index] { | |
return mapper(outer) | |
} | |
return nil | |
}, | |
length: self.length, | |
offset: self.offset | |
) | |
} | |
public func map<V>(mapper:T->V?)->BufferList<V> { | |
return BufferList<V>( | |
maker: { index in | |
if let outer = self[index] { | |
return mapper(outer) | |
} | |
return nil | |
}, | |
length: self.length, | |
offset: self.offset | |
) | |
} | |
public subscript(i:Int)->T? { | |
if (0 <= i && i < length) { | |
if let val = buffer[i] { | |
// Buffered | |
return val | |
} else { | |
// Unbuffered, make | |
let val = maker(i) | |
// Shrink buffer | |
while (bufferSize >= 0 && bufferPointers.count > 0 && bufferPointers.count > bufferSize) { | |
if let index = buffer.indexForKey(bufferPointers[0]) { | |
buffer.removeAtIndex(index) | |
} | |
bufferPointers.removeAtIndex(0) | |
} | |
if (bufferSize > 0) { | |
buffer[i] = val | |
} | |
return val | |
} | |
} | |
return nil | |
} | |
public static func empty() -> BufferList<T> { | |
return bufferlist(0, 0) { index in nil } | |
} | |
public func interleave(element: T) -> BufferList<T> { | |
return bufferlist(length * 2, bufferSize * 2) { index in | |
index % 2 == 1 ? element : self.maker(index / 2) | |
} | |
} | |
} | |
public func bufferlist<T>(count:Int, makerone: Int->T?)->BufferList<T> { | |
return BufferList ( | |
maker: makerone, | |
length: count, | |
offset: 0, | |
bufferSize: count | |
) | |
} | |
public func bufferlist<T>(count:Int, bufferSize:Int, makerone: Int->T?)->BufferList<T> { | |
return BufferList ( | |
maker: makerone, | |
length: count, | |
offset: 0, | |
bufferSize: bufferSize | |
) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment