pausable_timer.zig (1300B)
1 const std = @import("std"); 2 3 pub const PausableTimer = struct { 4 start_time: std.Io.Timestamp, 5 elapsed_before_pause: u64, 6 paused: bool, 7 8 pub fn init(io: std.Io) PausableTimer { 9 return .{ 10 .start_time = std.Io.Timestamp.now(io, .awake), 11 .elapsed_before_pause = 0, 12 .paused = true, 13 }; 14 } 15 16 pub fn togglePause(self: *PausableTimer, io: std.Io) void { 17 if (self.paused) { 18 self.start_time = std.Io.Timestamp.now(io, .awake); 19 self.paused = false; 20 } else { 21 const now = std.Io.Timestamp.now(io, .awake); 22 self.elapsed_before_pause += @as(u64, @intCast(self.start_time.durationTo(now).nanoseconds)); 23 self.paused = true; 24 } 25 } 26 27 pub fn reset(self: *PausableTimer, io: std.Io) void { 28 self.elapsed_before_pause = 0; 29 self.start_time = std.Io.Timestamp.now(io, .awake); 30 self.paused = true; 31 } 32 33 pub fn read(self: *PausableTimer, io: std.Io) u64 { 34 if (self.paused) { 35 return self.elapsed_before_pause; 36 } else { 37 const now = std.Io.Timestamp.now(io, .awake); 38 return self.elapsed_before_pause + @as(u64, @intCast(self.start_time.durationTo(now).nanoseconds)); 39 } 40 } 41 };