Search Apps Documentation Source Content File Folder Download Copy

util.gno

1.61 Kb ยท 67 lines
 1//
 2// Written by Maxim Khitrov (November 2012)
 3//
 4
 5package flow
 6
 7import (
 8	"math"
 9	"strconv"
10	"time"
11)
12
13// clockRate is the resolution and precision of clock().
14const clockRate = 20 * time.Millisecond
15
16// czero is the process start time rounded down to the nearest clockRate
17// increment.
18var czero = time.Now().Round(clockRate)
19
20// clock returns a low resolution timestamp relative to the process start time.
21func clock() time.Duration {
22	return time.Now().Round(clockRate).Sub(czero)
23}
24
25// clockToTime converts a clock() timestamp to an absolute time.Time value.
26func clockToTime(c time.Duration) time.Time {
27	return czero.Add(c)
28}
29
30// clockRound returns d rounded to the nearest clockRate increment.
31func clockRound(d time.Duration) time.Duration {
32	return (d + clockRate>>1) / clockRate * clockRate
33}
34
35// round returns x rounded to the nearest int64 (non-negative values only).
36func round(x float64) int64 {
37	if _, frac := math.Modf(x); frac >= 0.5 {
38		return int64(math.Ceil(x))
39	}
40	return int64(math.Floor(x))
41}
42
43// Percent represents a percentage in increments of 1/1000th of a percent.
44type Percent uint32
45
46// percentOf calculates what percent of the total is x.
47func percentOf(x, total float64) Percent {
48	if x < 0 || total <= 0 {
49		return 0
50	} else if p := round(x / total * 1e5); p <= math.MaxUint32 {
51		return Percent(p)
52	}
53	return Percent(math.MaxUint32)
54}
55
56func (p Percent) Float() float64 {
57	return float64(p) * 1e-3
58}
59
60func (p Percent) String() string {
61	var buf [12]byte
62	b := strconv.AppendUint(buf[:0], uint64(p)/1000, 10)
63	n := len(b)
64	b = strconv.AppendUint(b, 1000+uint64(p)%1000, 10)
65	b[n] = '.'
66	return string(append(b, '%'))
67}