F# token bucket rate limiter for bursts
F#
type TokenBucket(ratePerSecond: float, burst: float) =
let clock = System.Diagnostics.Stopwatch.StartNew()
let mutable last = 0.0
let mutable tokens = burst
member _.TryTake(count: float) =
let now = clock.Elapsed.TotalSeconds
tokens <- min burst (tokens + (now - last) * ratePerSecond)
last <- now
if tokens >= count then
tokens <- tokens - count
true
else false
member _.Available = tokens