Token bucket rate limiter for Nim
Nim
import std/[times, math]
type TokenBucket = object
cap, rate, tokens, last: float
proc initBucket(cap, rate: float): TokenBucket =
TokenBucket(cap: cap, rate: rate, tokens: cap, last: epochTime())
proc allow(b: var TokenBucket; now = epochTime()): bool =
b.tokens = min(b.cap, b.tokens + (now - b.last) * b.rate)
b.last = now
if b.tokens >= 1.0:
b.tokens -= 1.0
return true
false
var bucket = initBucket(5.0, 2.0) # burst 5, refill 2 tokens/s
for _ in 0 ..< 7: echo bucket.allow()