Files
MacMonitor/Sources/History/RollingRingBuffer.swift
gronod 7d2dd306ca
MacMonitor CI/CD Pipeline / Build & Test (Intel x86_64) (push) Successful in 1m49s
feat(history): implement rolling ring buffer, history store and Swift Charts trend view (Issue #23)
2026-09-08 13:15:23 +01:00

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)
}
}