module Data.ZoomCache.Unit (
SummaryData(..)
, SummaryWork(..)
)where
import Blaze.ByteString.Builder
import Control.Applicative ((<$>))
import Data.ByteString (ByteString)
import Data.Iteratee (Iteratee)
import Data.Monoid
import Text.Printf
import Data.ZoomCache.Codec
trackTypeUnit :: ByteString
trackTypeUnit = "ZOOMunit"
instance ZoomReadable () where
data SummaryData () = SummaryUnit
{ summaryUnitCount :: !Int
}
trackIdentifier = const trackTypeUnit
readRaw = return ()
readSummary = readSummaryUnit
prettyRaw = prettyPacketUnit
prettySummaryData = prettySummaryUnit
prettyPacketUnit :: () -> String
prettyPacketUnit = const "."
readSummaryUnit :: (Functor m, Monad m)
=> Iteratee ByteString m (SummaryData ())
readSummaryUnit = SummaryUnit <$> readInt32be
prettySummaryUnit :: SummaryData () -> String
prettySummaryUnit SummaryUnit{..} = printf "count: %d" summaryUnitCount
instance ZoomWrite () where
write = writeData
instance ZoomWrite (SampleOffset, ()) where
write = writeDataVBR
instance ZoomWrite (TimeStamp, ()) where
write = writeDataTS
instance ZoomWritable () where
data SummaryWork () = SummaryWorkUnit
{ swUnitCount :: !Int
}
fromRaw = const mempty
fromSummaryData = fromSummaryUnit
initSummaryWork = initSummaryUnit
toSummaryData = mkSummaryUnit
updateSummaryData = updateSummaryUnit
appendSummaryData = appendSummaryUnit
initSummaryUnit :: SampleOffset -> SummaryWork ()
initSummaryUnit _ = SummaryWorkUnit
{ swUnitCount = 0
}
mkSummaryUnit :: SampleOffsetDiff -> SummaryWork () -> SummaryData ()
mkSummaryUnit _dur SummaryWorkUnit{..} = SummaryUnit
{ summaryUnitCount = swUnitCount
}
fromSummaryUnit :: SummaryData () -> Builder
fromSummaryUnit SummaryUnit{..} = mconcat $ map fromIntegral32be
[ summaryUnitCount
]
updateSummaryUnit :: SampleOffset -> () -> SummaryWork ()
-> SummaryWork ()
updateSummaryUnit _t _ SummaryWorkUnit{..} = SummaryWorkUnit
{ swUnitCount = swUnitCount + 1
}
appendSummaryUnit :: SampleOffsetDiff -> SummaryData ()
-> SampleOffsetDiff -> SummaryData ()
-> SummaryData ()
appendSummaryUnit _dur1 s1 _dur2 s2 = SummaryUnit
{ summaryUnitCount = summaryUnitCount s1 + summaryUnitCount s2
}