Swift token bucket rate limiter class
Swift
import Foundation
final class TokenBucket {
private let capacity: Double, refillPerSecond: Double
private var tokens: Double
private var last = Date()
init(capacity: Double, refillPerSecond: Double) {
self.capacity = capacity
self.refillPerSecond = refillPerSecond
self.tokens = capacity
}
func take(_ count: Double = 1) -> Bool {
let now = Date()
tokens = min(capacity, tokens + now.timeIntervalSince(last) * refillPerSecond)
last = now
guard tokens >= count else { return false }
tokens -= count
return true
}
}