const std = @import("std");

pub const Duration = struct {
    ns: u64 = 0,

    pub fn div(self: Duration, rhs: u64) Duration {
        return .{ .ns = self.ns / rhs };
    }

    pub fn hz(self: Duration) u64 {
        return (1 * std.time.ns_per_s) / self.ns;
    }

    pub fn hzFloat(self: Duration) f64 {
        return (1 * std.time.ns_per_s) / @as(f64, @floatFromInt(self.ns));
    }

    pub fn formatDuration(duration: Duration, writer: *std.Io.Writer) std.Io.Writer.Error!void {
        try writer.printDuration(duration.ns, .{});
    }

    pub const format = formatDuration;
};

pub const Timer = struct {
    inner: std.time.Timer,

    pub fn start() !Timer {
        return .{ .inner = try std.time.Timer.start() };
    }

    pub fn lap(self: *Timer) Duration {
        return .{ .ns = self.inner.lap() };
    }

    pub fn read(self: *Timer) Duration {
        return .{ .ns = self.inner.read() };
    }

    pub fn reset(self: *Timer) void {
        self.inner.reset();
    }
};
