module Network.BufferedSocket.Writer
( sendWord8
, sendWord16
, sendWord32
, sendWord64
, sendInt8
, sendInt16
, sendInt32
, sendInt64
, Sendable
, send
)
where
import Prelude hiding (getLine, read)
import qualified Data.ByteString as B
import qualified Data.ByteString.Internal as BI
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Builder as BB
import qualified Data.ByteString.Char8 as BC8
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Encoding as ENC
import qualified Data.Text.Lazy.Encoding as ENCL
import Control.Monad
import Data.Functor
import Data.Monoid
import Data.Word
import Data.String
import Data.Int
import Data.Bits
import Foreign.Storable
import qualified Network.BufferedSocket.Core as BS
bitsToByteStringReal:: (Bits a, Integral a) => a -> Int -> [Word8]
bitsToByteStringReal a 0 = [fromIntegral a]
bitsToByteStringReal inData size =
let thisByte = shift inData ( (size * 8 ))
in (fromIntegral thisByte : bitsToByteStringReal inData (size 1))
bitsToByteString:: (Bits a, Integral a, Storable a) => a -> B.ByteString
bitsToByteString inData = B.pack $bitsToByteStringReal inData $ sizeOf inData 1
sendWord8:: BS.BufferedSocket -> Word8 -> IO ()
sendWord8 bSocket byte = BS.sendByteString bSocket $ B.pack [byte]
sendByte :: BS.BufferedSocket -> Word8 -> IO ()
sendByte = sendWord8
sendWord16:: BS.BufferedSocket -> Word16 -> IO ()
sendWord16 bSocket word16 = let sendData = bitsToByteString word16
in do
putStrLn $"sent bytes: " ++ (show $ B.unpack sendData)
BS.sendByteString bSocket $ sendData
sendWord32:: BS.BufferedSocket -> Word32 -> IO ()
sendWord32 bSocket word32 = BS.sendByteString bSocket $ bitsToByteString word32
sendWord64:: BS.BufferedSocket -> Word64 -> IO ()
sendWord64 bSocket word64 = BS.sendByteString bSocket $ bitsToByteString word64
sendInt8:: BS.BufferedSocket -> Int8 -> IO ()
sendInt8 bSocket int8 = sendWord8 bSocket $ fromIntegral int8
sendInt16:: BS.BufferedSocket -> Int16 -> IO ()
sendInt16 bSocket int16 = sendWord16 bSocket $ (fromIntegral int16 :: Word16)
sendInt32:: BS.BufferedSocket -> Int32 -> IO ()
sendInt32 bSocket int32 = sendWord32 bSocket $ fromIntegral int32
sendInt64:: BS.BufferedSocket -> Int64 -> IO ()
sendInt64 bSocket int64 = sendWord64 bSocket $ fromIntegral int64
sendLazyReal :: BS.BufferedSocket -> [B.ByteString] -> IO ()
sendLazyReal _ [] = return ()
sendLazyReal bSocket (x:xs) = BS.sendByteString bSocket x >> sendLazyReal bSocket xs
sendLazy :: BS.BufferedSocket -> BL.ByteString -> IO ()
sendLazy bSocket lazyBytestring = sendLazyReal bSocket $BL.toChunks lazyBytestring
class Sendable s where
send :: (BS.BufferedSocket -> s -> IO ())
instance Sendable Word8 where
send = sendWord8
instance Sendable Word16 where
send = sendWord16
instance Sendable Word32 where
send = sendWord32
instance Sendable Word64 where
send = sendWord64
instance Sendable Int8 where
send = sendInt8
instance Sendable Int16 where
send = sendInt16
instance Sendable Int32 where
send = sendInt32
instance Sendable Int64 where
send = sendInt64
instance Sendable B.ByteString where
send = BS.sendByteString
instance Sendable BL.ByteString where
send = sendLazy