feat(util/delay) add Delay
License: MIT Signed-off-by: Brian Tiger Chow <brian@perfmode.com>
Brian Tiger Chow committed
Dec 12, 2014 at 22:11 UTC
ae79ac04d3ae682fc56a269c4eb527a572aecabd
1 file changed
+39
util/delay/delay.go
new
+39
@@ -0,0 +1,39 @@
1
+package delay
2
+
3
+import (
4
+ "sync"
5
+ "time"
6
+)
7
+
8
+// Delay makes it easy to add (threadsafe) configurable delays to other
9
+// objects.
10
+type D interface {
11
+ Set(time.Duration) time.Duration
12
+ Wait()
13
+}
14
+
15
+// Fixed returns a delay with fixed latency
16
+func Fixed(t time.Duration) D {
17
+ return &delay{t: t}
18
+}
19
+
20
+type delay struct {
21
+ l sync.RWMutex
22
+ t time.Duration
23
+}
24
+
25
+// TODO func Variable(time.Duration) D returns a delay with probablistic latency
26
+
27
+func (d *delay) Set(t time.Duration) time.Duration {
28
+ d.l.Lock()
29
+ defer d.l.Unlock()
30
+ prev := d.t
31
+ d.t = t
32
+ return prev
33
+}
34
+
35
+func (d *delay) Wait() {
36
+ d.l.RLock()
37
+ defer d.l.RUnlock()
38
+ time.Sleep(d.t)
39
+}