{-# LANGUAGE FlexibleContexts, PackageImports #-}

module Data.Pipe.ByteString (fromHandleLn, toHandleLn, fromFileLn, toFileLn) where

import "monads-tf" Control.Monad.Trans
import Control.Monad.Trans.Control
import Data.Pipe
import System.IO

import qualified Data.ByteString.Char8 as BSC

fromHandleLn :: MonadIO m => Handle -> Pipe () BSC.ByteString m ()
fromHandleLn h = liftIO (BSC.hGetLine h) >>= (>> fromHandleLn h) . yield

toHandleLn :: MonadIO m => Handle -> Pipe BSC.ByteString () m ()
toHandleLn h =
	await >>= maybe (return ()) ((>> toHandleLn h) . liftIO . BSC.hPutStrLn h)

fromFileLn :: (MonadIO m, MonadBaseControl IO m) =>
	FilePath -> Pipe () BSC.ByteString m ()
fromFileLn fp =
	bracket (liftIO $ openFile fp ReadMode) (liftIO . hClose) fromHandleLn

toFileLn :: (MonadIO m, MonadBaseControl IO m) =>
	FilePath -> Pipe BSC.ByteString () m ()
toFileLn fp = bracket (liftIO $ openFile fp WriteMode) (liftIO . hClose) toHandleLn