private with Ada.Calendar;
package Stopwatch is
type Instance is tagged private;
procedure Reset (This : in out Instance);
function Elapsed (This : Instance) return Duration;
procedure Hold (This : in out Instance; Enable : Boolean := True);
-- Stop counting time, or re-start if not Enable
procedure Release (This : in out Instance);
-- Equivalent to Hold (Enable => False)
function Is_Held (This : Instance) return Boolean;
function Image (This : Instance; Decimals : Natural := 2) return String;
-- Elapsed time in seconds, without leading space, without units
function Image (Elapsed : Duration; Decimals : Natural := 2) return String;
-- Convenience to format durations even without a stopwatch
private
use Ada.Calendar;
type Instance is tagged record
Start : Time := Clock;
-- Last moment the timer was released/started
Held : Boolean := False;
Elapsed : Duration := 0.0;
-- Track elapsed time when held
end record;
end Stopwatch;