module Data.ZoomCache.Types (
Codec(..)
, TrackMap
, TrackSpec(..)
, IdentifyCodec
, Timestampable(..)
, before
, UTCTimestampable(..)
, beforeUTC
, ZoomReadable(..)
, ZoomWritable(..)
, ZoomRaw(..)
, ZoomSummary(..)
, ZoomSummaryUTC(..)
, ZoomSummarySO(..)
, ZoomWork(..)
, Packet(..)
, packetFromPacketSO
, Summary(..)
, summaryFromSummarySO
, PacketUTC(..)
, packetUTCFromPacket
, packetUTCFromPacketSO
, SummaryUTC(..)
, summaryUTCFromSummary
, summaryUTCFromSummarySO
, PacketSO(..)
, SummarySO(..)
, summarySODuration
, CacheFile(..)
, mkCacheFile
, fiFull
) where
import Blaze.ByteString.Builder
import Data.ByteString (ByteString)
import Data.Dynamic
import Data.IntMap (IntMap)
import qualified Data.IntMap as IM
import Data.Iteratee (Iteratee)
import Data.Maybe (fromJust)
import Data.Time (UTCTime)
import System.Posix.Types (FileOffset)
import Data.Offset
import Data.ZoomCache.Common
type TrackMap = IntMap TrackSpec
data TrackSpec = TrackSpec
{ specType :: !Codec
, specDeltaEncode :: !Bool
, specZlibCompress :: !Bool
, specSRType :: !SampleRateType
, specRate :: !Rational
, specName :: !ByteString
}
deriving (Show)
data Codec = forall a . ZoomReadable a => Codec a
instance Show Codec where
show = const "<<Codec>>"
type IdentifyCodec = ByteString -> Maybe Codec
data CacheFile = CacheFile
{ cfGlobal :: Global
, cfSpecs :: IntMap TrackSpec
, cfOffsets :: IntMap FileOffset
}
mkCacheFile :: Global -> CacheFile
mkCacheFile g = CacheFile g IM.empty IM.empty
fiFull :: CacheFile -> Bool
fiFull CacheFile{..} = IM.size cfSpecs == noTracks cfGlobal
class Timestampable a where
timestamp :: a -> Maybe TimeStamp
before :: (Timestampable a) => Maybe TimeStamp -> a -> Bool
before Nothing _ = True
before (Just b) x = t == Nothing || (fromJust t) < b
where
t = timestamp x
instance Timestampable (TimeStamp, a) where
timestamp = Just . fst
instance Timestampable a => Timestampable [a] where
timestamp [] = Nothing
timestamp (x:_) = timestamp x
instance Timestampable a => Timestampable (Offset a) where
timestamp (Offset _ xs) = timestamp xs
class UTCTimestampable a where
utcTimestamp :: a -> Maybe UTCTime
beforeUTC :: (UTCTimestampable a) => Maybe UTCTime -> a -> Bool
beforeUTC Nothing _ = True
beforeUTC (Just b) x = t == Nothing || (fromJust t) < b
where
t = utcTimestamp x
instance UTCTimestampable (UTCTime, a) where
utcTimestamp = Just . fst
instance UTCTimestampable a => UTCTimestampable [a] where
utcTimestamp [] = Nothing
utcTimestamp (x:_) = utcTimestamp x
instance UTCTimestampable a => UTCTimestampable (Offset a) where
utcTimestamp (Offset _ xs) = utcTimestamp xs
data PacketSO = PacketSO
{ packetSOTrack :: !TrackNo
, packetSOEntry :: !SampleOffset
, packetSOExit :: !SampleOffset
, packetSOCount :: !Int
, packetSOData :: !ZoomRaw
, packetSOSampleOffsets :: ![SampleOffset]
}
data Packet = Packet
{ packetTrack :: !TrackNo
, packetEntry :: !TimeStamp
, packetExit :: !TimeStamp
, packetCount :: !Int
, packetData :: !ZoomRaw
, packetTimeStamps :: ![TimeStamp]
}
packetFromPacketSO :: Rational -> PacketSO -> Packet
packetFromPacketSO r PacketSO{..} = Packet {
packetTrack = packetSOTrack
, packetEntry = timeStampFromSO r packetSOEntry
, packetExit = timeStampFromSO r packetSOExit
, packetCount = packetSOCount
, packetData = packetSOData
, packetTimeStamps = map (timeStampFromSO r) packetSOSampleOffsets
}
instance Timestampable Packet where
timestamp = Just . packetEntry
data PacketUTC = PacketUTC
{ packetUTCTrack :: !TrackNo
, packetUTCEntry :: !UTCTime
, packetUTCExit :: !UTCTime
, packetUTCCount :: !Int
, packetUTCData :: !ZoomRaw
, packetUTCTimeStamps :: ![UTCTime]
}
packetUTCFromPacket :: UTCTime -> Packet -> PacketUTC
packetUTCFromPacket base Packet{..} = PacketUTC {
packetUTCTrack = packetTrack
, packetUTCEntry = utcTimeFromTimeStamp base packetEntry
, packetUTCExit = utcTimeFromTimeStamp base packetExit
, packetUTCCount = packetCount
, packetUTCData = packetData
, packetUTCTimeStamps = map (utcTimeFromTimeStamp base) packetTimeStamps
}
packetUTCFromPacketSO :: UTCTime -> Rational -> PacketSO -> PacketUTC
packetUTCFromPacketSO base r = packetUTCFromPacket base . packetFromPacketSO r
instance UTCTimestampable PacketUTC where
utcTimestamp = Just . packetUTCEntry
data SummarySO a = SummarySO
{ summarySOTrack :: !TrackNo
, summarySOLevel :: !Int
, summarySOEntry :: !SampleOffset
, summarySOExit :: !SampleOffset
, summarySOData :: !(SummaryData a)
}
deriving (Typeable)
summarySODuration :: SummarySO a -> SampleOffsetDiff
summarySODuration s = SODiff $ (unSO $ summarySOExit s) (unSO $ summarySOEntry s)
data Summary a = Summary
{ summaryTrack :: !TrackNo
, summaryLevel :: !Int
, summaryEntry :: !TimeStamp
, summaryExit :: !TimeStamp
, summaryData :: !(SummaryData a)
}
deriving (Typeable)
summaryFromSummarySO :: Rational -> SummarySO a -> Summary a
summaryFromSummarySO r SummarySO{..} = Summary {
summaryTrack = summarySOTrack
, summaryLevel = summarySOLevel
, summaryEntry = timeStampFromSO r summarySOEntry
, summaryExit = timeStampFromSO r summarySOExit
, summaryData = summarySOData
}
instance Timestampable (Summary a) where
timestamp = Just . summaryEntry
data SummaryUTC a = SummaryUTC
{ summaryUTCTrack :: !TrackNo
, summaryUTCLevel :: !Int
, summaryUTCEntry :: !UTCTime
, summaryUTCExit :: !UTCTime
, summaryUTCData :: !(SummaryData a)
}
deriving (Typeable)
summaryUTCFromSummary :: UTCTime -> Summary a -> SummaryUTC a
summaryUTCFromSummary base Summary{..} = SummaryUTC {
summaryUTCTrack = summaryTrack
, summaryUTCLevel = summaryLevel
, summaryUTCEntry = utcTimeFromTimeStamp base summaryEntry
, summaryUTCExit = utcTimeFromTimeStamp base summaryExit
, summaryUTCData = summaryData
}
summaryUTCFromSummarySO :: UTCTime -> Rational -> SummarySO a -> SummaryUTC a
summaryUTCFromSummarySO base r = summaryUTCFromSummary base . summaryFromSummarySO r
instance UTCTimestampable (SummaryUTC a) where
utcTimestamp = Just . summaryUTCEntry
class Typeable a => ZoomReadable a where
data SummaryData a :: *
trackIdentifier :: a -> ByteString
readRaw :: (Functor m, Monad m)
=> Iteratee ByteString m a
readSummary :: (Functor m, Monad m)
=> Iteratee ByteString m (SummaryData a)
prettyRaw :: a -> String
prettySummaryData :: SummaryData a -> String
deltaDecodeRaw :: [a] -> [a]
deltaDecodeRaw = id
data ZoomRaw = forall a . ZoomReadable a => ZoomRaw [a]
data ZoomSummarySO = forall a . ZoomReadable a => ZoomSummarySO (SummarySO a)
data ZoomSummary = forall a . ZoomReadable a => ZoomSummary (Summary a)
instance Timestampable ZoomSummary where
timestamp (ZoomSummary s) = timestamp s
data ZoomSummaryUTC = forall a . ZoomReadable a => ZoomSummaryUTC (SummaryUTC a)
instance UTCTimestampable ZoomSummaryUTC where
utcTimestamp (ZoomSummaryUTC s) = utcTimestamp s
class ZoomReadable a => ZoomWritable a where
data SummaryWork a :: *
fromRaw :: a -> Builder
fromSummaryData :: SummaryData a -> Builder
initSummaryWork :: SampleOffset -> SummaryWork a
updateSummaryData :: SampleOffset -> a
-> SummaryWork a
-> SummaryWork a
toSummaryData :: SampleOffsetDiff -> SummaryWork a -> SummaryData a
appendSummaryData :: SampleOffsetDiff -> SummaryData a
-> SampleOffsetDiff -> SummaryData a
-> SummaryData a
deltaEncodeRaw :: SummaryWork a -> a -> a
deltaEncodeRaw _ = id
data ZoomWork = forall a . (Typeable a, ZoomWritable a) => ZoomWork
{ levels :: IntMap (SummarySO a)
, currWork :: Maybe (SummaryWork a)
}