Zig token bucket rate limiter with burst
Zig
const std = @import("std");
const Bucket = struct {
tokens: f64,
burst: f64,
per_sec: f64,
last_ns: i128,
fn allow(self: *Bucket, now_ns: i128) bool {
const elapsed = @as(f64, @floatFromInt(@max(now_ns - self.last_ns, 0))) / std.time.ns_per_s;
self.last_ns = now_ns;
self.tokens = @min(self.burst, self.tokens + elapsed * self.per_sec);
if (self.tokens < 1.0) return false;
self.tokens -= 1.0;
return true;
}
};