module Data.ZoomCache.Numeric.Int (
SummaryData(..)
, SummaryWork(..)
)where
import Blaze.ByteString.Builder
import Control.Applicative ((<$>))
import Data.ByteString (ByteString)
import Data.Int
import Data.Iteratee (Iteratee)
import Data.Maybe (fromMaybe)
import Text.Printf
import Data.ZoomCache.Codec
import Data.ZoomCache.Numeric.Internal
import Data.ZoomCache.Numeric.Types
instance ZoomReadable Int where
data SummaryData Int = SummaryInt
{ summaryIntEntry :: !Int
, summaryIntExit :: !Int
, summaryIntMin :: !Int
, summaryIntMax :: !Int
, summaryIntAvg :: !Double
, summaryIntRMS :: !Double
}
trackIdentifier = const "ZOOMintb"
readRaw = fromIntegral <$> readIntegerVLC
readSummary = readSummaryNum
prettyRaw = show
prettySummaryData = prettySummaryInt
deltaDecodeRaw = deltaDecodeNum
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomWrite Int where
write = writeData
instance ZoomWrite (SampleOffset, Int) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, Int) where
write = writeDataTS
instance ZoomWritable Int where
data SummaryWork Int = SummaryWorkInt
{ swIntTime :: !SampleOffset
, swIntEntry :: !(Maybe Int)
, swIntExit :: !Int
, swIntMin :: !Int
, swIntMax :: !Int
, swIntSum :: !Double
, swIntSumSq :: !Double
}
fromRaw = fromIntegerVLC . fromIntegral
fromSummaryData = fromSummaryNum
initSummaryWork = initSummaryNumBounded
toSummaryData = mkSummaryNum
updateSummaryData = updateSummaryNum
appendSummaryData = appendSummaryNum
deltaEncodeRaw = deltaEncodeNum
instance ZoomNum Int where
numEntry = summaryIntEntry
numExit = summaryIntExit
numMin = summaryIntMin
numMax = summaryIntMax
numAvg = summaryIntAvg
numRMS = summaryIntRMS
numWorkSO = swIntTime
numWorkEntry = swIntEntry
numWorkExit = swIntExit
numWorkMin = swIntMin
numWorkMax = swIntMax
numWorkSum = swIntSum
numWorkSumSq = swIntSumSq
numMkSummary = SummaryInt
numMkSummaryWork = SummaryWorkInt
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomReadable Int8 where
data SummaryData Int8 = SummaryInt8
{ summaryInt8Entry :: !Int8
, summaryInt8Exit :: !Int8
, summaryInt8Min :: !Int8
, summaryInt8Max :: !Int8
, summaryInt8Avg :: !Double
, summaryInt8RMS :: !Double
}
trackIdentifier = const "ZOOMiS8b"
readRaw = readInt8
readSummary = readSummaryNum
prettyRaw = show
prettySummaryData = prettySummaryInt
deltaDecodeRaw = deltaDecodeNum
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomWrite Int8 where
write = writeData
instance ZoomWrite (SampleOffset, Int8) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, Int8) where
write = writeDataTS
instance ZoomWritable Int8 where
data SummaryWork Int8 = SummaryWorkInt8
{ swInt8Time :: !SampleOffset
, swInt8Entry :: !(Maybe Int8)
, swInt8Exit :: !Int8
, swInt8Min :: !Int8
, swInt8Max :: !Int8
, swInt8Sum :: !Double
, swInt8SumSq :: !Double
}
fromRaw = fromInt8
fromSummaryData = fromSummaryNum
initSummaryWork = initSummaryNumBounded
toSummaryData = mkSummaryNum
updateSummaryData = updateSummaryNum
appendSummaryData = appendSummaryNum
deltaEncodeRaw = deltaEncodeNum
instance ZoomNum Int8 where
numEntry = summaryInt8Entry
numExit = summaryInt8Exit
numMin = summaryInt8Min
numMax = summaryInt8Max
numAvg = summaryInt8Avg
numRMS = summaryInt8RMS
numWorkSO = swInt8Time
numWorkEntry = swInt8Entry
numWorkExit = swInt8Exit
numWorkMin = swInt8Min
numWorkMax = swInt8Max
numWorkSum = swInt8Sum
numWorkSumSq = swInt8SumSq
numMkSummary = SummaryInt8
numMkSummaryWork = SummaryWorkInt8
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomReadable Int16 where
data SummaryData Int16 = SummaryInt16
{ summaryInt16Entry :: !Int16
, summaryInt16Exit :: !Int16
, summaryInt16Min :: !Int16
, summaryInt16Max :: !Int16
, summaryInt16Avg :: !Double
, summaryInt16RMS :: !Double
}
trackIdentifier = const "ZOOMi16b"
readRaw = readInt16be
readSummary = readSummaryNum
prettyRaw = show
prettySummaryData = prettySummaryInt
deltaDecodeRaw = deltaDecodeNum
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomWrite Int16 where
write = writeData
instance ZoomWrite (SampleOffset, Int16) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, Int16) where
write = writeDataTS
instance ZoomWritable Int16 where
data SummaryWork Int16 = SummaryWorkInt16
{ swInt16Time :: !SampleOffset
, swInt16Entry :: !(Maybe Int16)
, swInt16Exit :: !Int16
, swInt16Min :: !Int16
, swInt16Max :: !Int16
, swInt16Sum :: !Double
, swInt16SumSq :: !Double
}
fromRaw = fromInt16be
fromSummaryData = fromSummaryNum
initSummaryWork = initSummaryNumBounded
toSummaryData = mkSummaryNum
updateSummaryData = updateSummaryNum
appendSummaryData = appendSummaryNum
deltaEncodeRaw = deltaEncodeNum
instance ZoomNum Int16 where
numEntry = summaryInt16Entry
numExit = summaryInt16Exit
numMin = summaryInt16Min
numMax = summaryInt16Max
numAvg = summaryInt16Avg
numRMS = summaryInt16RMS
numWorkSO = swInt16Time
numWorkEntry = swInt16Entry
numWorkExit = swInt16Exit
numWorkMin = swInt16Min
numWorkMax = swInt16Max
numWorkSum = swInt16Sum
numWorkSumSq = swInt16SumSq
numMkSummary = SummaryInt16
numMkSummaryWork = SummaryWorkInt16
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomReadable Int32 where
data SummaryData Int32 = SummaryInt32
{ summaryInt32Entry :: !Int32
, summaryInt32Exit :: !Int32
, summaryInt32Min :: !Int32
, summaryInt32Max :: !Int32
, summaryInt32Avg :: !Double
, summaryInt32RMS :: !Double
}
trackIdentifier = const "ZOOMi32b"
readRaw = readInt32be
readSummary = readSummaryNum
prettyRaw = show
prettySummaryData = prettySummaryInt
deltaDecodeRaw = deltaDecodeNum
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomWrite Int32 where
write = writeData
instance ZoomWrite (SampleOffset, Int32) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, Int32) where
write = writeDataTS
instance ZoomWritable Int32 where
data SummaryWork Int32 = SummaryWorkInt32
{ swInt32Time :: !SampleOffset
, swInt32Entry :: !(Maybe Int32)
, swInt32Exit :: !Int32
, swInt32Min :: !Int32
, swInt32Max :: !Int32
, swInt32Sum :: !Double
, swInt32SumSq :: !Double
}
fromRaw = fromIntegral32be
fromSummaryData = fromSummaryNum
initSummaryWork = initSummaryNumBounded
toSummaryData = mkSummaryNum
updateSummaryData = updateSummaryNum
appendSummaryData = appendSummaryNum
deltaEncodeRaw = deltaEncodeNum
instance ZoomNum Int32 where
numEntry = summaryInt32Entry
numExit = summaryInt32Exit
numMin = summaryInt32Min
numMax = summaryInt32Max
numAvg = summaryInt32Avg
numRMS = summaryInt32RMS
numWorkSO = swInt32Time
numWorkEntry = swInt32Entry
numWorkExit = swInt32Exit
numWorkMin = swInt32Min
numWorkMax = swInt32Max
numWorkSum = swInt32Sum
numWorkSumSq = swInt32SumSq
numMkSummary = SummaryInt32
numMkSummaryWork = SummaryWorkInt32
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomReadable Int64 where
data SummaryData Int64 = SummaryInt64
{ summaryInt64Entry :: !Int64
, summaryInt64Exit :: !Int64
, summaryInt64Min :: !Int64
, summaryInt64Max :: !Int64
, summaryInt64Avg :: !Double
, summaryInt64RMS :: !Double
}
trackIdentifier = const "ZOOMi64b"
readRaw = readInt64be
readSummary = readSummaryNum
prettyRaw = show
prettySummaryData = prettySummaryInt
deltaDecodeRaw = deltaDecodeNum
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomWrite Int64 where
write = writeData
instance ZoomWrite (SampleOffset, Int64) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, Int64) where
write = writeDataTS
instance ZoomWritable Int64 where
data SummaryWork Int64 = SummaryWorkInt64
{ swInt64Time :: !SampleOffset
, swInt64Entry :: !(Maybe Int64)
, swInt64Exit :: !Int64
, swInt64Min :: !Int64
, swInt64Max :: !Int64
, swInt64Sum :: !Double
, swInt64SumSq :: !Double
}
fromRaw = fromInt64be
fromSummaryData = fromSummaryNum
initSummaryWork = initSummaryNumBounded
toSummaryData = mkSummaryNum
updateSummaryData = updateSummaryNum
appendSummaryData = appendSummaryNum
deltaEncodeRaw = deltaEncodeNum
instance ZoomNum Int64 where
numEntry = summaryInt64Entry
numExit = summaryInt64Exit
numMin = summaryInt64Min
numMax = summaryInt64Max
numAvg = summaryInt64Avg
numRMS = summaryInt64RMS
numWorkSO = swInt64Time
numWorkEntry = swInt64Entry
numWorkExit = swInt64Exit
numWorkMin = swInt64Min
numWorkMax = swInt64Max
numWorkSum = swInt64Sum
numWorkSumSq = swInt64SumSq
numMkSummary = SummaryInt64
numMkSummaryWork = SummaryWorkInt64
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomReadable Integer where
data SummaryData Integer = SummaryInteger
{ summaryIntegerEntry :: !Integer
, summaryIntegerExit :: !Integer
, summaryIntegerMin :: !Integer
, summaryIntegerMax :: !Integer
, summaryIntegerAvg :: !Double
, summaryIntegerRMS :: !Double
}
trackIdentifier = const "ZOOMintb"
readRaw = readIntegerVLC
readSummary = readSummaryNum
prettyRaw = show
prettySummaryData = prettySummaryInt
deltaDecodeRaw = deltaDecodeNum
#if __GLASGOW_HASKELL__ >= 702
#endif
instance ZoomWrite Integer where
write = writeData
instance ZoomWrite (SampleOffset, Integer) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, Integer) where
write = writeDataTS
instance ZoomWritable Integer where
data SummaryWork Integer = SummaryWorkInteger
{ swIntegerTime :: !SampleOffset
, swIntegerEntry :: !(Maybe Integer)
, swIntegerExit :: !Integer
, swIntegerMin :: !(Maybe Integer)
, swIntegerMax :: !(Maybe Integer)
, swIntegerSum :: !Double
, swIntegerSumSq :: !Double
}
fromRaw = fromIntegerVLC
fromSummaryData = fromSummaryNum
initSummaryWork = initSummaryInteger
toSummaryData = toSummaryInteger
updateSummaryData = updateSummaryInteger
appendSummaryData = appendSummaryNum
deltaEncodeRaw = deltaEncodeNum
instance ZoomNum Integer where
numEntry = summaryIntegerEntry
numExit = summaryIntegerExit
numMin = summaryIntegerMin
numMax = summaryIntegerMax
numAvg = summaryIntegerAvg
numRMS = summaryIntegerRMS
numWorkSO = swIntegerTime
numWorkEntry = swIntegerEntry
numWorkExit = swIntegerExit
numWorkMin = error "numWorkMin undefined for Integer"
numWorkMax = error "numWorkMax undefined for Integer"
numWorkSum = swIntegerSum
numWorkSumSq = swIntegerSumSq
numMkSummary = SummaryInteger
numMkSummaryWork = error "numMkSummaryWork undefined for Integer"
#if __GLASGOW_HASKELL__ >= 702
#endif
initSummaryInteger :: SampleOffset -> SummaryWork Integer
initSummaryInteger entry = SummaryWorkInteger entry Nothing 0 Nothing Nothing 0.0 0.0
toSummaryInteger :: SampleOffsetDiff -> SummaryWork Integer -> SummaryData Integer
toSummaryInteger (SODiff dur) SummaryWorkInteger{..} = SummaryInteger
{ summaryIntegerEntry = fromMaybe 0 swIntegerEntry
, summaryIntegerExit = swIntegerExit
, summaryIntegerMin = fromMaybe 0 swIntegerMin
, summaryIntegerMax = fromMaybe 0 swIntegerMax
, summaryIntegerAvg = swIntegerSum / fromIntegral dur
, summaryIntegerRMS = sqrt $ swIntegerSumSq / fromIntegral dur
}
updateSummaryInteger :: SampleOffset -> Integer
-> SummaryWork Integer
-> SummaryWork Integer
updateSummaryInteger t d SummaryWorkInteger{..} = SummaryWorkInteger
{ swIntegerTime = t
, swIntegerEntry = Just $ fromMaybe d swIntegerEntry
, swIntegerExit = d
, swIntegerMin = Just $ fromMaybe d swIntegerMin
, swIntegerMax = Just $ fromMaybe d swIntegerMax
, swIntegerSum = swIntegerSum + realToFrac (d * fromIntegral dur)
, swIntegerSumSq = swIntegerSumSq + realToFrac (d*d * fromIntegral dur)
}
where
!(SODiff dur) = sampleOffsetDiff t swIntegerTime
prettySummaryInt :: (PrintfArg a, ZoomNum a)
=> SummaryData a -> String
prettySummaryInt s = concat
[ printf "\tentry: %d\texit: %df\tmin: %d\tmax: %d\t"
(numEntry s) (numExit s) (numMin s) (numMax s)
, printf "avg: %.3f\trms: %.3f" (numAvg s) (numRMS s)
]