-- | Writing Shell programs using 'Handle's.
module Control.Shell.Handle (
    IO.BufferMode (..),
    hPutStr, hPutStrLn,
    hGetLine, hGetContents,
    hGetBytes, hPutBytes, hGetByteLine, hGetByteContents,
    hReady, hFlush, hClose,
    hGetBuffering, hSetBuffering
  ) where
import qualified System.IO as IO
import qualified Data.ByteString as BS
import Control.Shell.Base

-- | Write a string to a handle.
hPutStr :: IO.Handle -> String -> Shell ()
hPutStr h s = unsafeLiftIO $ IO.hPutStr h s

-- | Write a string to a handle, followed by a newline.
hPutStrLn :: IO.Handle -> String -> Shell ()
hPutStrLn h s = unsafeLiftIO $ IO.hPutStrLn h s

-- | Close a handle.
hClose :: IO.Handle -> Shell ()
hClose = unsafeLiftIO . IO.hClose

-- | Flush a handle.
hFlush :: IO.Handle -> Shell ()
hFlush = unsafeLiftIO . IO.hFlush

-- | Is the handle ready for reading?
hReady :: IO.Handle -> Shell Bool
hReady = unsafeLiftIO . IO.hReady

-- | Set the buffering mode of the given handle.
hSetBuffering :: IO.Handle -> IO.BufferMode -> Shell ()
hSetBuffering h = unsafeLiftIO . IO.hSetBuffering h

-- | Get the buffering mode of the given handle.
hGetBuffering :: IO.Handle -> Shell IO.BufferMode
hGetBuffering = unsafeLiftIO . IO.hGetBuffering

-- | Read a line of input from a handle.
hGetLine :: IO.Handle -> Shell String
hGetLine = unsafeLiftIO . IO.hGetLine

-- | Lazily read all remaining input from a handle.
hGetContents :: IO.Handle -> Shell String
hGetContents = unsafeLiftIO . IO.hGetContents

-- | Read @n@ bytes from a handle.
hGetBytes :: IO.Handle -> Int -> Shell BS.ByteString
hGetBytes h = unsafeLiftIO . BS.hGet h

-- | Read a line of input from a handle and return it as a 'BS.ByteString'.
hGetByteLine :: IO.Handle -> Shell BS.ByteString
hGetByteLine = unsafeLiftIO . BS.hGetLine

-- | Read all remaining input from a handle and return it as a 'BS.ByteString'.
hGetByteContents :: IO.Handle -> Shell BS.ByteString
hGetByteContents = unsafeLiftIO . BS.hGetContents

-- | Write a 'BS.ByteString' to a handle. Newline is not appended.
hPutBytes :: IO.Handle -> BS.ByteString -> Shell ()
hPutBytes h = unsafeLiftIO . BS.hPutStr h