tools

various tools I have been using throughout the years
Log | Files | Refs | README | LICENSE

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