module Data.MediaBus.Transcoder
    ( Transcoder(..)
    , transcodeStreamC'
    ) where

import           Conduit
import           Data.MediaBus.Stream
import           Data.Kind
import           Control.Parallel.Strategies ( NFData )

class Transcoder from to where
    type TranscodingSeqNum from to s :: Constraint
    type TranscodingSeqNum from to s = ()
    type TranscodingTicks from to t :: Constraint
    type TranscodingTicks from to t = ()
    transcode :: (TranscodingSeqNum from to s, TranscodingTicks from to t)
              => Frame s t from
              -> Frame s t to

transcodeStreamC' :: (NFData to, NFData p, NFData i, NFData s, NFData t, NFData p, Monad m, Transcoder from to, TranscodingSeqNum from to s, TranscodingTicks from to t)
                  => Conduit (Stream i s t p from) m (Stream i s t p to)
transcodeStreamC' = mapFramesC' transcode