module HSH.Channel (Channel(..),
chanAsString,
chanAsBSL,
chanAsBS,
chanToHandle,
Channelizable(..)
) where
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy.Char8 as BSLC
import System.IO
import Control.Concurrent
data Channel = ChanString String
| ChanBSL BSL.ByteString
| ChanHandle Handle
chanAsString :: Channel -> IO String
chanAsString (ChanString s) = return s
chanAsString (ChanBSL s) = return . bsl2str $ s
chanAsString (ChanHandle h) = hGetContents h
chanAsBSL :: Channel -> IO BSL.ByteString
chanAsBSL (ChanString s) = return . str2bsl $ s
chanAsBSL (ChanBSL s) = return s
chanAsBSL (ChanHandle h) = BSL.hGetContents h
chanAsBS :: Channel -> IO BS.ByteString
chanAsBS c = do r <- chanAsBSL c
let contents = BSL.toChunks r
return . BS.concat $ contents
chanToHandle :: Bool -> Channel -> Handle -> IO ()
chanToHandle close c h = if close then forkIO (dumpChanToHandle c h >> hClose h) >> return ()
else dumpChanToHandle c h
where dumpChanToHandle (ChanString s) h = hPutStr h s
dumpChanToHandle (ChanBSL s) h = BSL.hPut h s
dumpChanToHandle (ChanHandle srchdl) desthdl
= BSL.hGetContents srchdl >>= BSL.hPut desthdl
class Channelizable a where
toChannel :: a -> Channel
instance Channelizable String where
toChannel = ChanString
instance Channelizable BSL.ByteString where
toChannel = ChanBSL
instance Channelizable Handle where
toChannel = ChanHandle
instance Channelizable BS.ByteString where
toChannel bs = ChanBSL . BSL.fromChunks $ [bs]
str2bsl :: String -> BSL.ByteString
str2bsl = BSLC.pack
bsl2str :: BSL.ByteString -> String
bsl2str = BSLC.unpack