/Data/ZoomCache/Numeric/Word.hs

https://github.com/kfish/zoom-cache · Haskell · 570 lines · 302 code · 87 blank · 181 comment · 0 complexity · b6cd6bd75bb3579d3cda84549a3dcb07 MD5 · raw file

  1. {-# LANGUAGE BangPatterns #-}
  2. {-# LANGUAGE CPP #-}
  3. {-# LANGUAGE FlexibleContexts #-}
  4. {-# LANGUAGE FlexibleInstances #-}
  5. {-# LANGUAGE OverloadedStrings #-}
  6. {-# LANGUAGE RecordWildCards #-}
  7. {-# LANGUAGE TypeFamilies #-}
  8. {-# OPTIONS_GHC -Wall -fno-warn-orphans #-}
  9. ----------------------------------------------------------------------
  10. {- |
  11. Module : Data.ZoomCache.Numeric.Word
  12. Copyright : Conrad Parker
  13. License : BSD3-style (see LICENSE)
  14. Maintainer : Conrad Parker <conrad@metadecks.org>
  15. Stability : unstable
  16. Portability : unknown
  17. Default codec implementation for values of type Word. This module
  18. implements the interfaces documented in "Data.ZoomCache.Codec".
  19. View the module source for enlightenment.
  20. The table below describes the encoding of SummaryData for Word8:
  21. @
  22. | ... | -35
  23. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  24. | Entry (word8) | Exit (word8) | Min (word8) | Max (word8) | 36-39
  25. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  26. | Avg (double) | 40-43
  27. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  28. | | 44-47
  29. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  30. | RMS (double) | 48-51
  31. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  32. @
  33. The table below describes the encoding of SummaryData for Word16:
  34. @
  35. | ... | -35
  36. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  37. | Entry (word16) | Exit (word16) | 36-39
  38. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  39. | Min (word16) | Max (word16) | 40-43
  40. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  41. | Avg (double) | 44-47
  42. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  43. | | 48-51
  44. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  45. | RMS (double) | 52-55
  46. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  47. | | 56-59
  48. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  49. @
  50. The table below describes the encoding of SummaryData for Word32:
  51. @
  52. | ... | -35
  53. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  54. | Entry (word32) | 36-39
  55. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  56. | Exit (word32) | 40-43
  57. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  58. | Min (word32) | 44-47
  59. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  60. | Max (word32) | 48-51
  61. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  62. | Avg (double) | 52-55
  63. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  64. | | 56-59
  65. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  66. | RMS (double) | 60-63
  67. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  68. | | 64-67
  69. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  70. @
  71. The table below describes the encoding of SummaryData for Word64:
  72. @
  73. | ... | -35
  74. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  75. | Entry (word64) | 36-39
  76. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  77. | | 40-43
  78. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  79. | Exit (word64) | 44-47
  80. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  81. | | 48-51
  82. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  83. | Min (word64) | 52-55
  84. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  85. | | 56-59
  86. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  87. | Max (word64) | 60-63
  88. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  89. | | 64-67
  90. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  91. | Avg (double) | 68-71
  92. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  93. | | 72-75
  94. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  95. | RMS (double) | 76-79
  96. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  97. | | 80-83
  98. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  99. @
  100. SummaryData for Word is encoded as the following sequence, in which the
  101. variable-length coded sign bit is always zero:
  102. @
  103. Entry (intVLC)
  104. Exit (intVLC)
  105. Min (intVLC)
  106. Max (intVLC)
  107. Avg (double)
  108. RMS (double)
  109. @
  110. Field encoding formats:
  111. @word8@: 8bit unsigned integer
  112. @word16@: 16bit big endian unsigned integer
  113. @word32@: 32bit big endian unsigned integer
  114. @word64@: 32bit big endian unsigned integer
  115. @intVLC@: Variable-length-coded signed integer
  116. @double@: big-endian IEEE 754-2008 binary64 (IEEE 754-1985 double)
  117. For details of the variable-length coding format, see "Data.ZoomCache.Numeric.Int".
  118. -}
  119. ----------------------------------------------------------------------
  120. module Data.ZoomCache.Numeric.Word (
  121. SummaryData(..)
  122. , SummaryWork(..)
  123. )where
  124. #if __GLASGOW_HASKELL__ >= 702
  125. import Data.ByteString (ByteString)
  126. import Data.Iteratee (Iteratee)
  127. #endif
  128. import Blaze.ByteString.Builder
  129. import Control.Applicative ((<$>))
  130. import Data.Word
  131. import Text.Printf
  132. import Data.ZoomCache.Codec
  133. import Data.ZoomCache.Numeric.Internal
  134. import Data.ZoomCache.Numeric.Types
  135. ----------------------------------------------------------------------
  136. -- Word
  137. instance ZoomReadable Word where
  138. data SummaryData Word = SummaryWord
  139. { summaryWordEntry :: {-# UNPACK #-}!Word
  140. , summaryWordExit :: {-# UNPACK #-}!Word
  141. , summaryWordMin :: {-# UNPACK #-}!Word
  142. , summaryWordMax :: {-# UNPACK #-}!Word
  143. , summaryWordAvg :: {-# UNPACK #-}!Double
  144. , summaryWordRMS :: {-# UNPACK #-}!Double
  145. }
  146. trackIdentifier = const "ZOOMuntb"
  147. readRaw = fromIntegral <$> readIntegerVLC
  148. readSummary = readSummaryNum
  149. prettyRaw = show
  150. prettySummaryData = prettySummaryWord
  151. #if __GLASGOW_HASKELL__ >= 702
  152. {-# SPECIALIZE readSummaryNum :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData Word) #-}
  153. #endif
  154. instance ZoomWrite Word where
  155. write = writeData
  156. instance ZoomWrite (SampleOffset, Word) where
  157. write = writeDataVBR
  158. instance ZoomWrite (TimeStamp, Word) where
  159. write = writeDataTS
  160. instance ZoomWritable Word where
  161. data SummaryWork Word = SummaryWorkWord
  162. { swWordTime :: {-# UNPACK #-}!SampleOffset
  163. , swWordEntry :: !(Maybe Word)
  164. , swWordExit :: {-# UNPACK #-}!Word
  165. , swWordMin :: {-# UNPACK #-}!Word
  166. , swWordMax :: {-# UNPACK #-}!Word
  167. , swWordSum :: {-# UNPACK #-}!Double
  168. , swWordSumSq :: {-# UNPACK #-}!Double
  169. }
  170. fromRaw = fromIntegerVLC . fromIntegral
  171. fromSummaryData = fromSummaryNum
  172. initSummaryWork = initSummaryNumBounded
  173. toSummaryData = mkSummaryNum
  174. updateSummaryData = updateSummaryNum
  175. appendSummaryData = appendSummaryNum
  176. instance ZoomNum Word where
  177. numEntry = summaryWordEntry
  178. numExit = summaryWordExit
  179. numMin = summaryWordMin
  180. numMax = summaryWordMax
  181. numAvg = summaryWordAvg
  182. numRMS = summaryWordRMS
  183. numWorkSO = swWordTime
  184. numWorkEntry = swWordEntry
  185. numWorkExit = swWordExit
  186. numWorkMin = swWordMin
  187. numWorkMax = swWordMax
  188. numWorkSum = swWordSum
  189. numWorkSumSq = swWordSumSq
  190. numMkSummary = SummaryWord
  191. numMkSummaryWork = SummaryWorkWord
  192. #if __GLASGOW_HASKELL__ >= 702
  193. {-# SPECIALIZE fromSummaryNum :: SummaryData Word -> Builder #-}
  194. {-# SPECIALIZE initSummaryNumBounded :: SampleOffset -> SummaryWork Word #-}
  195. {-# SPECIALIZE mkSummaryNum :: SampleOffsetDiff -> SummaryWork Word -> SummaryData Word #-}
  196. {-# SPECIALIZE appendSummaryNum :: SampleOffsetDiff -> SummaryData Word -> SampleOffsetDiff -> SummaryData Word -> SummaryData Word #-}
  197. {-# SPECIALIZE updateSummaryNum :: SampleOffset -> Word -> SummaryWork Word -> SummaryWork Word #-}
  198. #endif
  199. ----------------------------------------------------------------------
  200. -- Word8
  201. instance ZoomReadable Word8 where
  202. data SummaryData Word8 = SummaryWord8
  203. { summaryWord8Entry :: {-# UNPACK #-}!Word8
  204. , summaryWord8Exit :: {-# UNPACK #-}!Word8
  205. , summaryWord8Min :: {-# UNPACK #-}!Word8
  206. , summaryWord8Max :: {-# UNPACK #-}!Word8
  207. , summaryWord8Avg :: {-# UNPACK #-}!Double
  208. , summaryWord8RMS :: {-# UNPACK #-}!Double
  209. }
  210. trackIdentifier = const "ZOOMu08b"
  211. readRaw = readWord8
  212. readSummary = readSummaryNum
  213. prettyRaw = show
  214. prettySummaryData = prettySummaryWord
  215. #if __GLASGOW_HASKELL__ >= 702
  216. {-# SPECIALIZE readSummaryNum :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData Word8) #-}
  217. #endif
  218. instance ZoomWrite Word8 where
  219. write = writeData
  220. instance ZoomWrite (SampleOffset, Word8) where
  221. write = writeDataVBR
  222. instance ZoomWrite (TimeStamp, Word8) where
  223. write = writeDataTS
  224. instance ZoomWritable Word8 where
  225. data SummaryWork Word8 = SummaryWorkWord8
  226. { swWord8Time :: {-# UNPACK #-}!SampleOffset
  227. , swWord8Entry :: !(Maybe Word8)
  228. , swWord8Exit :: {-# UNPACK #-}!Word8
  229. , swWord8Min :: {-# UNPACK #-}!Word8
  230. , swWord8Max :: {-# UNPACK #-}!Word8
  231. , swWord8Sum :: {-# UNPACK #-}!Double
  232. , swWord8SumSq :: {-# UNPACK #-}!Double
  233. }
  234. fromRaw = fromWord8
  235. fromSummaryData = fromSummaryNum
  236. initSummaryWork = initSummaryNumBounded
  237. toSummaryData = mkSummaryNum
  238. updateSummaryData = updateSummaryNum
  239. appendSummaryData = appendSummaryNum
  240. instance ZoomNum Word8 where
  241. numEntry = summaryWord8Entry
  242. numExit = summaryWord8Exit
  243. numMin = summaryWord8Min
  244. numMax = summaryWord8Max
  245. numAvg = summaryWord8Avg
  246. numRMS = summaryWord8RMS
  247. numWorkSO = swWord8Time
  248. numWorkEntry = swWord8Entry
  249. numWorkExit = swWord8Exit
  250. numWorkMin = swWord8Min
  251. numWorkMax = swWord8Max
  252. numWorkSum = swWord8Sum
  253. numWorkSumSq = swWord8SumSq
  254. numMkSummary = SummaryWord8
  255. numMkSummaryWork = SummaryWorkWord8
  256. #if __GLASGOW_HASKELL__ >= 702
  257. {-# SPECIALIZE fromSummaryNum :: SummaryData Word8 -> Builder #-}
  258. {-# SPECIALIZE initSummaryNumBounded :: SampleOffset -> SummaryWork Word8 #-}
  259. {-# SPECIALIZE mkSummaryNum :: SampleOffsetDiff -> SummaryWork Word8 -> SummaryData Word8 #-}
  260. {-# SPECIALIZE appendSummaryNum :: SampleOffsetDiff -> SummaryData Word8 -> SampleOffsetDiff -> SummaryData Word8 -> SummaryData Word8 #-}
  261. {-# SPECIALIZE updateSummaryNum :: SampleOffset -> Word8 -> SummaryWork Word8 -> SummaryWork Word8 #-}
  262. #endif
  263. ----------------------------------------------------------------------
  264. -- Word16
  265. instance ZoomReadable Word16 where
  266. data SummaryData Word16 = SummaryWord16
  267. { summaryWord16Entry :: {-# UNPACK #-}!Word16
  268. , summaryWord16Exit :: {-# UNPACK #-}!Word16
  269. , summaryWord16Min :: {-# UNPACK #-}!Word16
  270. , summaryWord16Max :: {-# UNPACK #-}!Word16
  271. , summaryWord16Avg :: {-# UNPACK #-}!Double
  272. , summaryWord16RMS :: {-# UNPACK #-}!Double
  273. }
  274. trackIdentifier = const "ZOOMu16b"
  275. readRaw = readWord16be
  276. readSummary = readSummaryNum
  277. prettyRaw = show
  278. prettySummaryData = prettySummaryWord
  279. #if __GLASGOW_HASKELL__ >= 702
  280. {-# SPECIALIZE readSummaryNum :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData Word16) #-}
  281. #endif
  282. instance ZoomWrite Word16 where
  283. write = writeData
  284. instance ZoomWrite (SampleOffset, Word16) where
  285. write = writeDataVBR
  286. instance ZoomWrite (TimeStamp, Word16) where
  287. write = writeDataTS
  288. instance ZoomWritable Word16 where
  289. data SummaryWork Word16 = SummaryWorkWord16
  290. { swWord16Time :: {-# UNPACK #-}!SampleOffset
  291. , swWord16Entry :: !(Maybe Word16)
  292. , swWord16Exit :: {-# UNPACK #-}!Word16
  293. , swWord16Min :: {-# UNPACK #-}!Word16
  294. , swWord16Max :: {-# UNPACK #-}!Word16
  295. , swWord16Sum :: {-# UNPACK #-}!Double
  296. , swWord16SumSq :: {-# UNPACK #-}!Double
  297. }
  298. fromRaw = fromWord16be
  299. fromSummaryData = fromSummaryNum
  300. initSummaryWork = initSummaryNumBounded
  301. toSummaryData = mkSummaryNum
  302. updateSummaryData = updateSummaryNum
  303. appendSummaryData = appendSummaryNum
  304. instance ZoomNum Word16 where
  305. numEntry = summaryWord16Entry
  306. numExit = summaryWord16Exit
  307. numMin = summaryWord16Min
  308. numMax = summaryWord16Max
  309. numAvg = summaryWord16Avg
  310. numRMS = summaryWord16RMS
  311. numWorkSO = swWord16Time
  312. numWorkEntry = swWord16Entry
  313. numWorkExit = swWord16Exit
  314. numWorkMin = swWord16Min
  315. numWorkMax = swWord16Max
  316. numWorkSum = swWord16Sum
  317. numWorkSumSq = swWord16SumSq
  318. numMkSummary = SummaryWord16
  319. numMkSummaryWork = SummaryWorkWord16
  320. #if __GLASGOW_HASKELL__ >= 702
  321. {-# SPECIALIZE fromSummaryNum :: SummaryData Word16 -> Builder #-}
  322. {-# SPECIALIZE initSummaryNumBounded :: SampleOffset -> SummaryWork Word16 #-}
  323. {-# SPECIALIZE mkSummaryNum :: SampleOffsetDiff -> SummaryWork Word16 -> SummaryData Word16 #-}
  324. {-# SPECIALIZE appendSummaryNum :: SampleOffsetDiff -> SummaryData Word16 -> SampleOffsetDiff -> SummaryData Word16 -> SummaryData Word16 #-}
  325. {-# SPECIALIZE updateSummaryNum :: SampleOffset -> Word16 -> SummaryWork Word16 -> SummaryWork Word16 #-}
  326. #endif
  327. ----------------------------------------------------------------------
  328. -- Word32
  329. instance ZoomReadable Word32 where
  330. data SummaryData Word32 = SummaryWord32
  331. { summaryWord32Entry :: {-# UNPACK #-}!Word32
  332. , summaryWord32Exit :: {-# UNPACK #-}!Word32
  333. , summaryWord32Min :: {-# UNPACK #-}!Word32
  334. , summaryWord32Max :: {-# UNPACK #-}!Word32
  335. , summaryWord32Avg :: {-# UNPACK #-}!Double
  336. , summaryWord32RMS :: {-# UNPACK #-}!Double
  337. }
  338. trackIdentifier = const "ZOOMu32b"
  339. readRaw = readWord32be
  340. readSummary = readSummaryNum
  341. prettyRaw = show
  342. prettySummaryData = prettySummaryWord
  343. #if __GLASGOW_HASKELL__ >= 702
  344. {-# SPECIALIZE readSummaryNum :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData Word32) #-}
  345. #endif
  346. instance ZoomWrite Word32 where
  347. write = writeData
  348. instance ZoomWrite (SampleOffset, Word32) where
  349. write = writeDataVBR
  350. instance ZoomWrite (TimeStamp, Word32) where
  351. write = writeDataTS
  352. instance ZoomWritable Word32 where
  353. data SummaryWork Word32 = SummaryWorkWord32
  354. { swWord32Time :: {-# UNPACK #-}!SampleOffset
  355. , swWord32Entry :: !(Maybe Word32)
  356. , swWord32Exit :: {-# UNPACK #-}!Word32
  357. , swWord32Min :: {-# UNPACK #-}!Word32
  358. , swWord32Max :: {-# UNPACK #-}!Word32
  359. , swWord32Sum :: {-# UNPACK #-}!Double
  360. , swWord32SumSq :: {-# UNPACK #-}!Double
  361. }
  362. fromRaw = fromWord32be
  363. fromSummaryData = fromSummaryNum
  364. initSummaryWork = initSummaryNumBounded
  365. toSummaryData = mkSummaryNum
  366. updateSummaryData = updateSummaryNum
  367. appendSummaryData = appendSummaryNum
  368. instance ZoomNum Word32 where
  369. numEntry = summaryWord32Entry
  370. numExit = summaryWord32Exit
  371. numMin = summaryWord32Min
  372. numMax = summaryWord32Max
  373. numAvg = summaryWord32Avg
  374. numRMS = summaryWord32RMS
  375. numWorkSO = swWord32Time
  376. numWorkEntry = swWord32Entry
  377. numWorkExit = swWord32Exit
  378. numWorkMin = swWord32Min
  379. numWorkMax = swWord32Max
  380. numWorkSum = swWord32Sum
  381. numWorkSumSq = swWord32SumSq
  382. numMkSummary = SummaryWord32
  383. numMkSummaryWork = SummaryWorkWord32
  384. #if __GLASGOW_HASKELL__ >= 702
  385. {-# SPECIALIZE fromSummaryNum :: SummaryData Word32 -> Builder #-}
  386. {-# SPECIALIZE initSummaryNumBounded :: SampleOffset -> SummaryWork Word32 #-}
  387. {-# SPECIALIZE mkSummaryNum :: SampleOffsetDiff -> SummaryWork Word32 -> SummaryData Word32 #-}
  388. {-# SPECIALIZE appendSummaryNum :: SampleOffsetDiff -> SummaryData Word32 -> SampleOffsetDiff -> SummaryData Word32 -> SummaryData Word32 #-}
  389. {-# SPECIALIZE updateSummaryNum :: SampleOffset -> Word32 -> SummaryWork Word32 -> SummaryWork Word32 #-}
  390. #endif
  391. ----------------------------------------------------------------------
  392. -- Word64
  393. instance ZoomReadable Word64 where
  394. data SummaryData Word64 = SummaryWord64
  395. { summaryWord64Entry :: {-# UNPACK #-}!Word64
  396. , summaryWord64Exit :: {-# UNPACK #-}!Word64
  397. , summaryWord64Min :: {-# UNPACK #-}!Word64
  398. , summaryWord64Max :: {-# UNPACK #-}!Word64
  399. , summaryWord64Avg :: {-# UNPACK #-}!Double
  400. , summaryWord64RMS :: {-# UNPACK #-}!Double
  401. }
  402. trackIdentifier = const "ZOOMu64b"
  403. readRaw = readWord64be
  404. readSummary = readSummaryNum
  405. prettyRaw = show
  406. prettySummaryData = prettySummaryWord
  407. #if __GLASGOW_HASKELL__ >= 702
  408. {-# SPECIALIZE readSummaryNum :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData Word64) #-}
  409. #endif
  410. instance ZoomWrite Word64 where
  411. write = writeData
  412. instance ZoomWrite (SampleOffset, Word64) where
  413. write = writeDataVBR
  414. instance ZoomWrite (TimeStamp, Word64) where
  415. write = writeDataTS
  416. instance ZoomWritable Word64 where
  417. data SummaryWork Word64 = SummaryWorkWord64
  418. { swWord64Time :: {-# UNPACK #-}!SampleOffset
  419. , swWord64Entry :: !(Maybe Word64)
  420. , swWord64Exit :: {-# UNPACK #-}!Word64
  421. , swWord64Min :: {-# UNPACK #-}!Word64
  422. , swWord64Max :: {-# UNPACK #-}!Word64
  423. , swWord64Sum :: {-# UNPACK #-}!Double
  424. , swWord64SumSq :: {-# UNPACK #-}!Double
  425. }
  426. fromRaw = fromWord64be
  427. fromSummaryData = fromSummaryNum
  428. initSummaryWork = initSummaryNumBounded
  429. toSummaryData = mkSummaryNum
  430. updateSummaryData = updateSummaryNum
  431. appendSummaryData = appendSummaryNum
  432. instance ZoomNum Word64 where
  433. numEntry = summaryWord64Entry
  434. numExit = summaryWord64Exit
  435. numMin = summaryWord64Min
  436. numMax = summaryWord64Max
  437. numAvg = summaryWord64Avg
  438. numRMS = summaryWord64RMS
  439. numWorkSO = swWord64Time
  440. numWorkEntry = swWord64Entry
  441. numWorkExit = swWord64Exit
  442. numWorkMin = swWord64Min
  443. numWorkMax = swWord64Max
  444. numWorkSum = swWord64Sum
  445. numWorkSumSq = swWord64SumSq
  446. numMkSummary = SummaryWord64
  447. numMkSummaryWork = SummaryWorkWord64
  448. #if __GLASGOW_HASKELL__ >= 702
  449. {-# SPECIALIZE fromSummaryNum :: SummaryData Word64 -> Builder #-}
  450. {-# SPECIALIZE initSummaryNumBounded :: SampleOffset -> SummaryWork Word64 #-}
  451. {-# SPECIALIZE mkSummaryNum :: SampleOffsetDiff -> SummaryWork Word64 -> SummaryData Word64 #-}
  452. {-# SPECIALIZE appendSummaryNum :: SampleOffsetDiff -> SummaryData Word64 -> SampleOffsetDiff -> SummaryData Word64 -> SummaryData Word64 #-}
  453. {-# SPECIALIZE updateSummaryNum :: SampleOffset -> Word64 -> SummaryWork Word64 -> SummaryWork Word64 #-}
  454. #endif
  455. ----------------------------------------------------------------------
  456. prettySummaryWord :: (PrintfArg a, ZoomNum a)
  457. => SummaryData a -> String
  458. prettySummaryWord s = concat
  459. [ printf "\tentry: %d\texit: %df\tmin: %d\tmax: %d\t"
  460. (numEntry s) (numExit s) (numMin s) (numMax s)
  461. , printf "avg: %.3f\trms: %.3f" (numAvg s) (numRMS s)
  462. ]