Schedule/Sources/Schedule/Bucket.swift

78 lines
1.6 KiB
Swift

import Foundation
struct BucketKey {
private let _underlying: UInt64
init(underlying: UInt64) {
self._underlying = underlying
}
func increased() -> BucketKey {
let i = _underlying &+ 1
return BucketKey(underlying: i)
}
}
extension BucketKey: Equatable {
static func == (lhs: BucketKey, rhs: BucketKey) -> Bool {
return lhs._underlying == rhs._underlying
}
}
struct Bucket<Element> {
private typealias Entry = (key: BucketKey, element: Element)
private var key = BucketKey(underlying: 0)
private var entries: [Entry] = []
@discardableResult
mutating func add(_ new: Element) -> BucketKey {
defer { key = key.increased() }
let entry = (key: key, element: new)
entries.append(entry)
return key
}
@discardableResult
mutating func removeElement(for key: BucketKey) -> Element? {
if let index = entries.firstIndex(where: { $0.key == key }) {
return entries.remove(at: index).element
}
return nil
}
func element(for key: BucketKey) -> Element? {
if let entry = entries.first(where: { $0.key == key }) {
return entry.element
}
return nil
}
mutating func removeAll() {
entries.removeAll()
}
var count: Int {
return entries.count
}
}
extension Bucket: Sequence {
func makeIterator() -> AnyIterator<Element> {
var iterator = entries.makeIterator()
return AnyIterator<Element> {
return iterator.next()?.element
}
}
}