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;
    }
};