Skip to content

Instantly share code, notes, and snippets.

@hermanbanken
Created October 6, 2015 11:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hermanbanken/d1fa9fca91c52f8ce7de to your computer and use it in GitHub Desktop.
Save hermanbanken/d1fa9fca91c52f8ce7de to your computer and use it in GitHub Desktop.
//
// 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