module Data.SouSiT.File (
fileSourceChar,
fileSourceLine,
fileSourceByteString,
fileSourceWord8,
fileSinkChar,
fileSinkString,
fileSinkLine,
fileSinkByteString,
fileSinkWord8,
fileSinkWord8Unbuffered
) where
import System.IO
import qualified Data.ByteString as BS
import Data.SouSiT
import Data.SouSiT.Handle
import qualified Data.SouSiT.Trans as T
import Data.Word
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
fileSourceB :: (MonadIO m, MonadResource m) => (Handle -> IO a) -> FilePath -> FeedSource m a
fileSourceB get path = hSourceRes (liftIO. get) $ openBinaryFile path ReadMode
fileSourceT :: (MonadIO m, MonadResource m) => (Handle -> IO a) -> FilePath -> FeedSource m a
fileSourceT get path = hSourceRes (liftIO . get) $ openFile path ReadMode
fileSourceChar :: (MonadIO m, MonadResource m) => FilePath -> FeedSource m Char
fileSourceChar = fileSourceT hGetChar
fileSourceLine :: (MonadIO m, MonadResource m) => FilePath -> FeedSource m String
fileSourceLine = fileSourceT hGetLine
fileSourceByteString :: (MonadIO m, MonadResource m) => Int -> FilePath -> FeedSource m BS.ByteString
fileSourceByteString chunk = fileSourceB rd
where rd h = BS.hGetSome h chunk
fileSourceWord8 :: (MonadIO m, MonadResource m) => FilePath -> SimpleSource m Word8
fileSourceWord8 path = fileSourceByteString word8ChunkSize path $= T.map BS.unpack =$= T.disperse
word8ChunkSize = 256
liftPut put h a = liftIO $ put h a
fileSinkT :: (MonadIO m, MonadResource m) => (Handle -> a -> IO ()) -> FilePath -> Sink a m ()
fileSinkT put path = hSinkRes (liftPut put) $ openFile path WriteMode
fileSinkB :: (MonadIO m, MonadResource m) => (Handle -> a -> IO ()) -> FilePath -> Sink a m ()
fileSinkB put path = hSinkRes (liftPut put) $ openBinaryFile path WriteMode
fileSinkChar :: (MonadIO m, MonadResource m) => FilePath -> Sink Char m ()
fileSinkChar = fileSinkT hPutChar
fileSinkString :: (MonadIO m, MonadResource m) => FilePath -> Sink String m ()
fileSinkString = fileSinkT hPutStr
fileSinkLine :: (MonadIO m, MonadResource m) => FilePath -> Sink String m ()
fileSinkLine = fileSinkT hPutStrLn
fileSinkByteString :: (MonadIO m, MonadResource m) => FilePath -> Sink BS.ByteString m ()
fileSinkByteString = fileSinkB BS.hPut
fileSinkWord8Unbuffered :: (MonadIO m, MonadResource m) => FilePath -> Sink Word8 m ()
fileSinkWord8Unbuffered path = T.map BS.singleton =$ fileSinkByteString path
fileSinkWord8 :: (MonadIO m, MonadResource m) => Int -> FilePath -> Sink Word8 m ()
fileSinkWord8 bs path = T.buffer bs BS.empty BS.snoc =$ fileSinkByteString path