MacMonitor CI/CD Pipeline / Build & Test (Intel x86_64) (push) Successful in 1m49s
55 lines
1.3 KiB
Swift
55 lines
1.3 KiB
Swift
import Foundation
|
|
|
|
public struct HistoricalSample<T>: Identifiable {
|
|
public let id: UUID
|
|
public let timestamp: Date
|
|
public let value: T
|
|
|
|
public init(timestamp: Date = Date(), value: T) {
|
|
self.id = UUID()
|
|
self.timestamp = timestamp
|
|
self.value = value
|
|
}
|
|
}
|
|
|
|
public final class RollingRingBuffer<T> {
|
|
private var buffer: [HistoricalSample<T>]
|
|
private let capacity: Int
|
|
private let lock = NSLock()
|
|
|
|
public init(capacity: Int = 60) {
|
|
self.capacity = max(1, capacity)
|
|
self.buffer = []
|
|
self.buffer.reserveCapacity(self.capacity)
|
|
}
|
|
|
|
public func append(_ value: T, timestamp: Date = Date()) {
|
|
lock.lock()
|
|
defer { lock.unlock() }
|
|
|
|
let sample = HistoricalSample(timestamp: timestamp, value: value)
|
|
if buffer.count >= capacity {
|
|
buffer.removeFirst()
|
|
}
|
|
buffer.append(sample)
|
|
}
|
|
|
|
public var samples: [HistoricalSample<T>] {
|
|
lock.lock()
|
|
defer { lock.unlock() }
|
|
return buffer
|
|
}
|
|
|
|
public var count: Int {
|
|
lock.lock()
|
|
defer { lock.unlock() }
|
|
return buffer.count
|
|
}
|
|
|
|
public func clear() {
|
|
lock.lock()
|
|
defer { lock.unlock() }
|
|
buffer.removeAll(keepingCapacity: true)
|
|
}
|
|
}
|