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 (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
run :: OSC -> T () -> B.ByteString
run msg (Cons m) = Put.runPut (runReaderT m msg)