// zig fmt: off
const std = @import("std");
const Clock = @This();

timestamp: i128 = 0,
timestamp_limit: ?i128 = null,

pub fn sleep(self: *Clock, nanoseconds: u64) void {
    const nanoseconds_i128: i128 = @intCast(nanoseconds);
    const new_timestamp = self.timestamp + nanoseconds_i128;

    if (self.timestamp_limit != null) {
        while (true) {
            self.timestamp = @min(self.timestamp_limit.?, new_timestamp);

            if (self.timestamp < self.timestamp_limit.?) {
                break;
            }

            std.time.sleep(std.time.ms_per_s * 100);
        }
    } else {
        self.timestamp = new_timestamp;
    }
}

pub fn nanoTimestamp(self: Clock) i128 {
    return self.timestamp;
}
