on master help sign in
WebSocketTest/Sources/App/Models/CyclicBuffer.swift
40 lines 915 B history raw
1//
2// CyclicBuffer.swift
3// App
4//
5// Created by Ilya on 29/11/2018.
6//
8import Foundation
10struct CyclicBuffer<T> {
11 private var buffer: [T?]
12 private var index = 0
13 let size: Int
15 init(count: Int) {
16 buffer = Array(repeating: nil, count: count)
17 size = count
18 }
20 private let queue = DispatchQueue(label: "soy.iko.cyclicBufferqueue", attributes: DispatchQueue.Attributes.concurrent)
22 mutating func append(_ element: T) {
23 queue.sync(flags: .barrier) {
24 self.buffer[self.index] = element
25 self.index = (self.index + 1) % self.size
26 }
27 }
29 func getLast(count: Int = 1) -> [T] {
30 var out: [T] = []
32 queue.sync {
33 out = Array((buffer[index..<size] + buffer[0..<index]).lazy
34 .compactMap {$0}
35 .suffix(count))
36 }
38 return out
39 }