module Sound.OpenSoundControl.Transport.Monad.ByteString (run, ) where

import qualified Sound.OpenSoundControl.Transport.Monad as TM

import Sound.OpenSoundControl.OSC (encodeOSC, OSC, )

import Control.Monad.Trans.Reader (ReaderT, runReaderT, ask, )
import Control.Monad.Trans.Class (lift, )

import qualified Data.ByteString.Lazy as B
import qualified Data.Binary.Put as Put


newtype T a = Cons (ReaderT OSC Put.PutM a)
   deriving (Functor, Monad)


instance TM.C T where
   send msg = Cons $ lift $
      let b = encodeOSC msg
      in  Put.putWord32be (fromIntegral (B.length b)) >>
          Put.putLazyByteString b

   recv = Cons ask



{- |
Write sent messages to a ByteString.
All 'recv' calls are answered with @msg@.
-}
run :: OSC -> T () -> B.ByteString
run msg (Cons m) = Put.runPut (runReaderT m msg)