{- | Files with binary content. -} module System.IO.Exception.BinaryFile where import System.IO.Exception.File (EIO, close, ) import Control.Monad.Exception.Synchronous (bracketT, ) import System.IO.Straight (ioToExceptionalSIO, ) import System.IO (Handle, IOMode, ) import qualified System.IO as IO import Data.Word (Word8, ) import Data.Char (ord, chr, ) open :: FilePath -> IOMode -> EIO Handle open name mode = ioToExceptionalSIO $ IO.openBinaryFile name mode with :: FilePath -> IOMode -> (Handle -> EIO r) -> EIO r with name mode = bracketT (open name mode) close getByte :: Handle -> EIO Word8 getByte h = ioToExceptionalSIO $ fmap (fromIntegral . ord) $ IO.hGetChar h putByte :: Handle -> Word8 -> EIO () putByte h c = ioToExceptionalSIO $ IO.hPutChar h (chr . fromIntegral $ c)