module Data.SouSiT.Handle (
hSource,
hSource',
hSourceRes,
hSourceNoEOF,
hSourceNoEOF',
hSourceResNoEOF,
hSink,
hSinkRes
) where
import Data.SouSiT.Source
import Data.SouSiT.Sink
import System.IO
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
hSource :: MonadIO m => (Handle -> m a) -> Handle -> FeedSource m a
hSource get = actionSource . toEof get
hSource' :: (Handle -> IO a) -> IO Handle -> FeedSource IO a
hSource' get open = bracketActionSource open (liftIO . hClose) (toEof get)
hSourceRes :: (MonadIO m, MonadResource m) => (Handle -> m a) -> IO Handle -> FeedSource m a
hSourceRes get open = FeedSource fun
where fun sink = do (r,h) <- allocate open (liftIO . hClose)
sink' <- feedToSink (actionSource $ toEof get h) sink
release r
return sink'
toEof get h = (liftIO . hIsEOF) h >>= next
where next True = return Nothing
next False = liftM Just (get h)
hSourceNoEOF :: MonadIO m => (Handle -> m a) -> Handle -> FeedSource m a
hSourceNoEOF get = actionSource . liftM Just . get
hSourceNoEOF' :: (Handle -> IO a) -> IO Handle -> FeedSource IO a
hSourceNoEOF' get open = bracketActionSource open hClose (liftM Just . get)
hSourceResNoEOF :: (MonadIO m, MonadResource m) => (Handle -> m a) -> IO Handle -> FeedSource m a
hSourceResNoEOF get open = FeedSource fun
where fun sink = do (r,h) <- allocate open (liftIO . hClose)
sink' <- feedToSink (actionSource $ liftM Just $ get h) sink
release r
return sink'
hSink :: MonadIO m => (Handle -> a -> m ()) -> Handle -> Sink a m ()
hSink put h = actionSink (put h)
hSinkRes :: (MonadIO m, MonadResource m) => (Handle -> a -> m ()) -> IO Handle -> Sink a m ()
hSinkRes put open = openCloseActionSink o (release . fst) (put . snd)
where o = allocate open (liftIO . hClose)