with Time_Utilities;
package body Timer is
    task Alarm is
        entry Set_Alarm (To_Expire_At : Time_Utilities.Time);
    end Alarm;

    task body Alarm is
        Period : Duration := Duration'Last;
    begin
        loop
            select
                delay Period;
                Period := Duration'Last;
                Wake_Up;
            or
                accept Set_Alarm (To_Expire_At : Time_Utilities.Time) do
                    Period := Time_Utilities.Duration_Until (To_Expire_At);
                end Set_Alarm;
            end select;
        end loop;
    end Alarm;
    procedure Set_Timer (To_Expire_At : Time_Utilities.Time) is
    begin
        Alarm.Set_Alarm (To_Expire_At);
    end Set_Timer;
end Timer;