1 module des.util.timer;
2 
3 import std.datetime;
4 import core.thread;
5 
6 ///
7 struct TimerCallback
8 {
9     double time=0; ///
10     double tick=0; ///
11     void delegate() func; ///
12 
13     ///
14     void reset() { time = 0; }
15 
16     ///
17     void update( double dt )
18     {  
19         time += dt;
20         if( time > tick )
21         {
22             time = 0;
23             if( func ) func();
24         }
25     }
26 }
27 
28 ///
29 class Timer
30 {
31     StopWatch sw; ///
32     double time=0; ///
33     double all_time=0; ///
34     size_t cbindex=0; ///
35 
36     TimerCallback[string] callback; ///
37 
38     ///
39     this() { sw.start(); }
40 
41     ///
42     string every( double dt, void delegate() fnc )
43     { 
44         import std.string;
45         auto key = format( "__auto_gen_callback_%04d", cbindex++ );
46         callback[key] = TimerCallback( 0, dt, fnc ); 
47         return key;
48     }
49 
50     ///
51     void every( double dt, string key, void delegate() fnc )
52     { callback[key] = TimerCallback( 0, dt, fnc ); }
53 
54     ///
55     void removeCallback( string key )
56     { callback.remove(key); }
57 
58     ///
59     double reset()
60     {
61         auto r = time;
62         time = 0;
63         foreach( cb; callback ) cb.reset();
64         return r;
65     }
66 
67     ///
68     void restart( double s=0 )
69     {
70         cycle();
71         Thread.sleep( dur!"usecs"(cast(ulong)(s*1e6)) );
72     }
73 
74     ///
75     double hardReset()
76     {
77         auto r = all_time;
78         all_time = 0;
79         reset();
80         return r;
81     }
82 
83     ///
84     double cycle()
85     {
86         sw.stop();
87         auto dt = sw.peek().to!("seconds",double);
88         sw.reset();
89         sw.start();
90         time += dt;
91         all_time += dt;
92         foreach( cb; callback ) cb.update( dt );
93         return dt;
94     }
95 }