module Data.MediaBus.Discontinous ( Discontinous(..) , _Missing , _Got , concealMissing ) where import Conduit import Control.Lens import Control.Parallel.Strategies ( NFData ) import Data.Default import Data.MediaBus.Ticks import Data.MediaBus.Payload import Data.MediaBus.Stream import GHC.Generics ( Generic ) -- TODO create a gap detection mechanism, a simple stateful conduit that knows the next timestamp data Discontinous a = Missing | Got !a deriving (Show, Generic) instance NFData a => NFData (Discontinous a) instance Default (Discontinous a) where def = Missing makePrisms ''Discontinous instance (HasDuration a) => HasDuration (Discontinous a) where getDuration Missing = 0 getDuration (Got !x) = getDuration x instance HasPayload a => HasPayload (Discontinous a) where type GetPayload (Discontinous a) = GetPayload a type SetPayload (Discontinous a) b = Discontinous (SetPayload a b) payload = _Got . payload concealMissing :: (NFData c, Monad m) => c -> Conduit (Stream i s t p (Discontinous c)) m (Stream i s t p c) concealMissing conceal = mapPayloadC' go where go (Got !b) = b go Missing = conceal-- TODO delete ??