-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTime.hs
More file actions
52 lines (45 loc) · 1.61 KB
/
Copy pathTime.hs
File metadata and controls
52 lines (45 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
module Time where
import Data.ByteString.Char8
import Data.ByteString.Builder
import Data.Monoid
data Time = Time Int Int Int Int deriving (Show, Eq, Ord)
-- | Parse bytestring time in HHMMSShh format.
parseTime :: ByteString -> Time
parseTime bt = Time (fi h) (fi m) (fi s) (fi hs)
where
fi = fromIntegral
t = maybe 0 fst $ readInteger bt
h = t `div` 1000000 `mod` 100
m = t `div` 10000 `mod` 100
s = t `div` 100 `mod` 100
hs = t `mod` 100
-- | Convert from Unix time
fromUnixTime :: Integral n => n -> Time
fromUnixTime t = Time (fi h) (fi m) (fi s) (fi hs)
where
fi = fromIntegral
h = t `div` 3600000000 `mod` 24
m = t `div` 60000000 `mod` 60
s = t `div` 1000000 `mod` 60
hs = t `div` 10000 `mod` 100
-- | Format a 'Time' as HHMMSShh.
mkTime :: Time -> Builder
mkTime (Time h m s hs) = mkDigits h <> mkDigits m <> mkDigits s <> mkDigits hs
where
mkDigits n = let (t, u) = divMod n 10 in mkDigit t <> mkDigit u
mkDigit = intDec
-- | Calculate the different betweeen two 'Time' values in hundredths of a second.
diffTime :: Time -> Time -> Int
diffTime (Time ah am as ahs) (Time bh bm bs bhs) =
(ah - bh) * 360000 +
(am - bm) * 6000 +
(as - bs) * 100 +
(ahs - bhs)
-- | Add hundredths of a second to a 'Time'
addTime :: Time -> Int -> Time
addTime (Time h m s hs) hundredths =
let (s', hs') = divMod (hs + hundredths) 100
(m', s'') = divMod (s + s') 60
(h', m'') = divMod (m + m') 60
h'' = mod (h + h') 60
in Time h'' m'' s'' hs'