safer-file-handles 0.9 → 0.10
raw patch · 4 files changed
+196/−168 lines, 4 filesdep +monad-controldep −monad-peeldep ~regional-pointersdep ~regionsPVP ok
version bump matches the API change (PVP)
Dependencies added: monad-control
Dependencies removed: monad-peel
Dependency ranges changed: regional-pointers, regions
API changes (from Hackage documentation)
+ System.IO.SaferFileHandles: class FileHandle handle :: (* -> (* -> *) -> *)
+ System.IO.SaferFileHandles: data StdFileHandle ioMode r :: (* -> *)
+ System.IO.SaferFileHandles: instance FileHandle StdFileHandle
- System.IO.SaferFileHandles: cast :: (AncestorRegion pr cr, MonadIO cr, CheckMode castedIOMode) => RegionalFileHandle anyIOMode pr -> cr (Maybe (RegionalFileHandle castedIOMode pr))
+ System.IO.SaferFileHandles: cast :: (AncestorRegion pr cr, MonadIO cr, CheckMode castedIOMode) => StdFileHandle anyIOMode pr -> cr (Maybe (StdFileHandle castedIOMode pr))
- System.IO.SaferFileHandles: hFileSize :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Integer
+ System.IO.SaferFileHandles: hFileSize :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Integer
- System.IO.SaferFileHandles: hFlush :: (AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => RegionalFileHandle ioMode pr -> cr ()
+ System.IO.SaferFileHandles: hFlush :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => handle ioMode pr -> cr ()
- System.IO.SaferFileHandles: hGetBuf :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr1 -> RegionalPtr α pr2 -> Int -> cr Int
+ System.IO.SaferFileHandles: hGetBuf :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, FileHandle handle, AllocatedPointer pointer, MonadIO cr, ReadModes ioMode) => handle ioMode pr1 -> pointer α pr2 -> Int -> cr Int
- System.IO.SaferFileHandles: hGetBufNonBlocking :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr1 -> RegionalPtr α pr2 -> Int -> cr Int
+ System.IO.SaferFileHandles: hGetBufNonBlocking :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, FileHandle handle, AllocatedPointer pointer, MonadIO cr, ReadModes ioMode) => handle ioMode pr1 -> pointer α pr2 -> Int -> cr Int
- System.IO.SaferFileHandles: hGetBufSome :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr1 -> RegionalPtr α pr2 -> Int -> cr Int
+ System.IO.SaferFileHandles: hGetBufSome :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, FileHandle handle, AllocatedPointer pointer, MonadIO cr, ReadModes ioMode) => handle ioMode pr1 -> pointer α pr2 -> Int -> cr Int
- System.IO.SaferFileHandles: hGetBuffering :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr BufferMode
+ System.IO.SaferFileHandles: hGetBuffering :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr BufferMode
- System.IO.SaferFileHandles: hGetChar :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> cr Char
+ System.IO.SaferFileHandles: hGetChar :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> cr Char
- System.IO.SaferFileHandles: hGetContents :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> cr String
+ System.IO.SaferFileHandles: hGetContents :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> cr String
- System.IO.SaferFileHandles: hGetEcho :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hGetEcho :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hGetEncoding :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr (Maybe TextEncoding)
+ System.IO.SaferFileHandles: hGetEncoding :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr (Maybe TextEncoding)
- System.IO.SaferFileHandles: hGetLine :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> cr String
+ System.IO.SaferFileHandles: hGetLine :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> cr String
- System.IO.SaferFileHandles: hGetPosn :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr HandlePosn
+ System.IO.SaferFileHandles: hGetPosn :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr HandlePosn
- System.IO.SaferFileHandles: hIsClosed :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsClosed :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hIsEOF :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsEOF :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hIsOpen :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsOpen :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hIsReadable :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsReadable :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hIsSeekable :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsSeekable :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hIsTerminalDevice :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsTerminalDevice :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hIsWritable :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hIsWritable :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hLookAhead :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> cr Char
+ System.IO.SaferFileHandles: hLookAhead :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> cr Char
- System.IO.SaferFileHandles: hPrint :: (AncestorRegion pr cr, MonadIO cr, WriteModes ioMode, Show α) => RegionalFileHandle ioMode pr -> α -> cr ()
+ System.IO.SaferFileHandles: hPrint :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, WriteModes ioMode, Show α) => handle ioMode pr -> α -> cr ()
- System.IO.SaferFileHandles: hPutBuf :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, MonadIO cr, WriteModes ioMode) => RegionalFileHandle ioMode pr1 -> RegionalPtr α pr2 -> Int -> cr ()
+ System.IO.SaferFileHandles: hPutBuf :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, FileHandle handle, AllocatedPointer pointer, MonadIO cr, WriteModes ioMode) => handle ioMode pr1 -> pointer α pr2 -> Int -> cr ()
- System.IO.SaferFileHandles: hPutBufNonBlocking :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, MonadIO cr, WriteModes ioMode) => RegionalFileHandle ioMode pr1 -> RegionalPtr α pr2 -> Int -> cr Int
+ System.IO.SaferFileHandles: hPutBufNonBlocking :: (AncestorRegion pr1 cr, AncestorRegion pr2 cr, FileHandle handle, AllocatedPointer pointer, MonadIO cr, WriteModes ioMode) => handle ioMode pr1 -> pointer α pr2 -> Int -> cr Int
- System.IO.SaferFileHandles: hPutChar :: (AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => RegionalFileHandle ioMode pr -> Char -> cr ()
+ System.IO.SaferFileHandles: hPutChar :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => handle ioMode pr -> Char -> cr ()
- System.IO.SaferFileHandles: hPutStr :: (AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => RegionalFileHandle ioMode pr -> String -> cr ()
+ System.IO.SaferFileHandles: hPutStr :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => handle ioMode pr -> String -> cr ()
- System.IO.SaferFileHandles: hPutStrLn :: (AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => RegionalFileHandle ioMode pr -> String -> cr ()
+ System.IO.SaferFileHandles: hPutStrLn :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, WriteModes ioMode) => handle ioMode pr -> String -> cr ()
- System.IO.SaferFileHandles: hReady :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> cr Bool
+ System.IO.SaferFileHandles: hReady :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> cr Bool
- System.IO.SaferFileHandles: hSeek :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> SeekMode -> Integer -> cr ()
+ System.IO.SaferFileHandles: hSeek :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> SeekMode -> Integer -> cr ()
- System.IO.SaferFileHandles: hSetBinaryMode :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> Bool -> cr ()
+ System.IO.SaferFileHandles: hSetBinaryMode :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> Bool -> cr ()
- System.IO.SaferFileHandles: hSetBuffering :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> BufferMode -> cr ()
+ System.IO.SaferFileHandles: hSetBuffering :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> BufferMode -> cr ()
- System.IO.SaferFileHandles: hSetEcho :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> Bool -> cr ()
+ System.IO.SaferFileHandles: hSetEcho :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> Bool -> cr ()
- System.IO.SaferFileHandles: hSetEncoding :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> TextEncoding -> cr ()
+ System.IO.SaferFileHandles: hSetEncoding :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> TextEncoding -> cr ()
- System.IO.SaferFileHandles: hSetFileSize :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> Integer -> cr ()
+ System.IO.SaferFileHandles: hSetFileSize :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> Integer -> cr ()
- System.IO.SaferFileHandles: hSetNewlineMode :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> NewlineMode -> cr ()
+ System.IO.SaferFileHandles: hSetNewlineMode :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> NewlineMode -> cr ()
- System.IO.SaferFileHandles: hShow :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr String
+ System.IO.SaferFileHandles: hShow :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr String
- System.IO.SaferFileHandles: hTell :: (AncestorRegion pr cr, MonadIO cr) => RegionalFileHandle ioMode pr -> cr Integer
+ System.IO.SaferFileHandles: hTell :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr) => handle ioMode pr -> cr Integer
- System.IO.SaferFileHandles: hWaitForInput :: (AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => RegionalFileHandle ioMode pr -> Int -> cr Bool
+ System.IO.SaferFileHandles: hWaitForInput :: (FileHandle handle, AncestorRegion pr cr, MonadIO cr, ReadModes ioMode) => handle ioMode pr -> Int -> cr Bool
- System.IO.SaferFileHandles: openBinaryFile :: (MonadPeelIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
+ System.IO.SaferFileHandles: openBinaryFile :: (MonadControlIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
- System.IO.SaferFileHandles: openBinaryFile' :: (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
+ System.IO.SaferFileHandles: openBinaryFile' :: (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
- System.IO.SaferFileHandles: openBinaryTempFile :: (MonadPeelIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
+ System.IO.SaferFileHandles: openBinaryTempFile :: (MonadControlIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
- System.IO.SaferFileHandles: openBinaryTempFileWithDefaultPermissions :: (MonadPeelIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
+ System.IO.SaferFileHandles: openBinaryTempFileWithDefaultPermissions :: (MonadControlIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
- System.IO.SaferFileHandles: openFile :: (MonadPeelIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
+ System.IO.SaferFileHandles: openFile :: (MonadControlIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
- System.IO.SaferFileHandles: openFile' :: (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
+ System.IO.SaferFileHandles: openFile' :: (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> RegionT s pr (RegionalFileHandle ioMode (RegionT s pr))
- System.IO.SaferFileHandles: openTempFile :: (MonadPeelIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
+ System.IO.SaferFileHandles: openTempFile :: (MonadControlIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
- System.IO.SaferFileHandles: openTempFileWithDefaultPermissions :: (MonadPeelIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
+ System.IO.SaferFileHandles: openTempFileWithDefaultPermissions :: (MonadControlIO pr, AbsRelClass ar) => DirPath ar -> Template -> RegionT s pr (AbsFile, RegionalFileHandle ReadWriteMode (RegionT s pr))
- System.IO.SaferFileHandles: stderr :: RegionalFileHandle WriteMode RootRegion
+ System.IO.SaferFileHandles: stderr :: StdFileHandle WriteMode RootRegion
- System.IO.SaferFileHandles: stdin :: RegionalFileHandle ReadMode RootRegion
+ System.IO.SaferFileHandles: stdin :: StdFileHandle ReadMode RootRegion
- System.IO.SaferFileHandles: stdout :: RegionalFileHandle WriteMode RootRegion
+ System.IO.SaferFileHandles: stdout :: StdFileHandle WriteMode RootRegion
- System.IO.SaferFileHandles: withBinaryFile :: (MonadPeelIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
+ System.IO.SaferFileHandles: withBinaryFile :: (MonadControlIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
- System.IO.SaferFileHandles: withBinaryFile' :: (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
+ System.IO.SaferFileHandles: withBinaryFile' :: (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
- System.IO.SaferFileHandles: withFile :: (MonadPeelIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
+ System.IO.SaferFileHandles: withFile :: (MonadControlIO pr, AbsRelClass ar) => FilePath ar -> IOMode ioMode -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
- System.IO.SaferFileHandles: withFile' :: (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
+ System.IO.SaferFileHandles: withFile' :: (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) => FilePath ar -> (forall s. RegionalFileHandle ioMode (RegionT s pr) -> RegionT s pr α) -> pr α
- System.IO.SaferFileHandles.Unsafe: unsafeHandle :: RegionalFileHandle ioMode r -> Handle ioMode
+ System.IO.SaferFileHandles.Unsafe: unsafeHandle :: FileHandle handle => handle ioMode r -> Handle ioMode
- System.IO.SaferFileHandles.Unsafe: wrap :: MonadIO m => (Handle ioMode -> IO α) -> (RegionalFileHandle ioMode r -> m α)
+ System.IO.SaferFileHandles.Unsafe: wrap :: (FileHandle handle, MonadIO m) => (Handle ioMode -> IO α) -> (handle ioMode r -> m α)
- System.IO.SaferFileHandles.Unsafe: wrap2 :: MonadIO m => (Handle ioMode -> β -> IO α) -> (RegionalFileHandle ioMode r -> β -> m α)
+ System.IO.SaferFileHandles.Unsafe: wrap2 :: (FileHandle handle, MonadIO m) => (Handle ioMode -> β -> IO α) -> (handle ioMode r -> β -> m α)
- System.IO.SaferFileHandles.Unsafe: wrap3 :: MonadIO m => (Handle ioMode -> γ -> β -> IO α) -> (RegionalFileHandle ioMode r -> γ -> β -> m α)
+ System.IO.SaferFileHandles.Unsafe: wrap3 :: (FileHandle handle, MonadIO m) => (Handle ioMode -> γ -> β -> IO α) -> (handle ioMode r -> γ -> β -> m α)
Files
- System/IO/SaferFileHandles.hs +173/−144
- System/IO/SaferFileHandles/Internal.hs +12/−10
- System/IO/SaferFileHandles/Unsafe.hs +7/−10
- safer-file-handles.cabal +4/−4
System/IO/SaferFileHandles.hs view
@@ -2,6 +2,7 @@ , NoImplicitPrelude , CPP , RankNTypes+ , KindSignatures #-} -------------------------------------------------------------------------------@@ -52,8 +53,9 @@ ------------------------------------------------------------------------------- module System.IO.SaferFileHandles- ( -- * Regional file handles- RegionalFileHandle+ ( -- * File handles+ FileHandle+ , RegionalFileHandle -- ** IO Modes -- | Types that represent the IOMode an opened file can be in.@@ -62,9 +64,11 @@ , AppendMode , ReadWriteMode + -- *** Grouping the IOMode types. , ReadModes , WriteModes + -- *** A value-level IOMode. , IOMode(..) , MkIOMode(mkIOMode) @@ -73,7 +77,7 @@ for the majority of cases. In the rare occasion that you know these handles have different IOModes you can 'cast' them. - Note that these handles a pure values. This means they don't perform the+ Note that these handles are pure values. This means they don't perform the side-effect of registering a finalizer like @hClose stdin@ in the 'RegionT' monad. @@ -81,6 +85,7 @@ 'RootRegion' which is the ancestor of any region. This allows the standard handles to be used in any region. -}+ , StdFileHandle , stdin, stdout, stderr , cast @@ -91,14 +96,10 @@ , openFile', withFile' -- ** Regions- {-| Note that this module re-exports the @Control.Monad.Trans.Region@- module from the @regions@ package which allows you to:-- * Run a region using 'runRegionT'.-- * Concurrently run a region inside another region using 'forkIOTopRegion'.-- * Duplicate a 'RegionalFileHandle' to a parent region using 'dup'.+ {-|+ Note that this module re-exports the @Control.Monad.Trans.Region@ module+ from the @regions@ package which allows you to run regions using 'runRegionT'+ and duplicate a 'RegionalFileHandle' to a parent region using 'dup'. -} , module Control.Monad.Trans.Region @@ -244,18 +245,18 @@ import Prelude ( Integer ) import Control.Monad ( return, (>>=), liftM ) import Data.Bool ( Bool(..) )-import Data.Function ( ($), flip )+import Data.Function ( ($) ) import Data.Functor ( fmap ) import Data.Char ( Char, String ) import Data.Int ( Int )-import Data.Maybe ( Maybe(Nothing, Just) )+import Data.Maybe ( Maybe ) import Text.Show ( Show ) import Text.Read ( Read ) import Foreign.Ptr ( Ptr ) import qualified System.IO as SIO -#if __GLASGOW_HASKELL__ < 701+#if __GLASGOW_HASKELL__ < 700 import Control.Monad ( fail ) #endif @@ -266,10 +267,6 @@ -- from base-unicode-symbols: import Data.Function.Unicode ( (∘) ) --- from monad-peel:-import Control.Monad.IO.Peel ( MonadPeelIO )-import Control.Exception.Peel ( block )- -- from transformers: import Control.Monad.IO.Class ( MonadIO, liftIO ) @@ -327,44 +324,62 @@ ) -- from regional-pointers:-import Foreign.Ptr.Region ( RegionalPtr )+import Foreign.Ptr.Region ( AllocatedPointer ) import Foreign.Ptr.Region.Unsafe ( unsafePtr ) -- from ourselves:-import System.IO.SaferFileHandles.Internal ( RegionalFileHandle(RegionalFileHandle) )+import System.IO.SaferFileHandles.Internal ( RegionalFileHandle(RegionalFileHandle)+ , FileHandle+ ) import System.IO.SaferFileHandles.Unsafe ( unsafeHandle , wrap, wrap2, wrap3 , sanitizeIOError ) +-- from monad-control:+import Control.Monad.IO.Control ( MonadControlIO ) +#if MIN_VERSION_base(4,3,0)+import Control.Exception.Control ( mask_ )+#else+import Control.Exception.Control ( block )++mask_ ∷ MonadControlIO m ⇒ m a → m a+mask_ = block+#endif++ ------------------------------------------------------------------------------- -- ** Standard handles ------------------------------------------------------------------------------- +newtype StdFileHandle ioMode (r ∷ * → *) = StdFileHandle (Handle ioMode)++instance FileHandle StdFileHandle where+ unsafeHandle (StdFileHandle handle) = handle+ -- | Wraps: @System.IO.'SIO.stdin'@.-stdin ∷ RegionalFileHandle ReadMode RootRegion-stdin = RegionalFileHandle E.stdin Nothing+stdin ∷ StdFileHandle ReadMode RootRegion+stdin = StdFileHandle E.stdin -- | Wraps: @System.IO.'SIO.stdout'@.-stdout ∷ RegionalFileHandle WriteMode RootRegion-stdout = RegionalFileHandle E.stdout Nothing+stdout ∷ StdFileHandle WriteMode RootRegion+stdout = StdFileHandle E.stdout -- | Wraps: @System.IO.'SIO.stderr'@.-stderr ∷ RegionalFileHandle WriteMode RootRegion-stderr = RegionalFileHandle E.stderr Nothing+stderr ∷ StdFileHandle WriteMode RootRegion+stderr = StdFileHandle E.stderr {-| Cast the IOMode of a handle if the handle supports it. -This function is primarily used in combination with the standard handles. When-you know the IOMode of a handle is different from its default IOMode you can-cast it to the right one.+This function is used in combination with the standard handles.+When you know the IOMode of a handle is different from its default IOMode you+can cast it to the right one. -} cast ∷ (pr `AncestorRegion` cr, MonadIO cr, CheckMode castedIOMode)- ⇒ RegionalFileHandle anyIOMode pr- → cr (Maybe (RegionalFileHandle castedIOMode pr))-cast (RegionalFileHandle h mbCloseHndl) =- (liftM ∘ fmap) (flip RegionalFileHandle mbCloseHndl) $ liftIO $ E.cast h+ ⇒ StdFileHandle anyIOMode pr+ → cr (Maybe (StdFileHandle castedIOMode pr))+cast = (liftM ∘ fmap) StdFileHandle ∘ liftIO ∘ E.cast ∘ unsafeHandle -------------------------------------------------------------------------------@@ -409,30 +424,30 @@ Note: if you will be working with files containing binary data, you'll want to be using 'openBinaryFile'. -}-openFile ∷ (MonadPeelIO pr, AbsRelClass ar)+openFile ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ FilePath ar → IOMode ioMode → RegionT s pr (RegionalFileHandle ioMode (RegionT s pr)) openFile = openNormal E.openFile -openNormal ∷ (MonadPeelIO pr, AbsRelClass ar)+openNormal ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ (E.FilePath → IOMode ioMode → IO (E.Handle ioMode)) → ( FilePath ar → IOMode ioMode → RegionT s pr (RegionalFileHandle ioMode (RegionT s pr)) )-openNormal open = \filePath ioMode → block $ do+openNormal open = \filePath ioMode → mask_ $ do h ← liftIO $ open (getPathString filePath) ioMode ch ← onExit $ sanitizeIOError $ hClose h- return $ RegionalFileHandle h $ Just ch+ return $ RegionalFileHandle h ch {-| Convenience function which opens a file, applies the given continuation function to the resulting regional file handle and runs the resulting region. This provides a safer safer replacement for @System.IO.'SIO.withFile'@. -}-withFile ∷ (MonadPeelIO pr, AbsRelClass ar)+withFile ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ FilePath ar → IOMode ioMode → (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α)@@ -445,14 +460,14 @@ -- inferred from the type of the resulting 'RegionalFileHandle'. -- -- Note that: @openFile' fp = 'openFile' fp 'mkIOMode'@.-openFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)+openFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) ⇒ FilePath ar → RegionT s pr (RegionalFileHandle ioMode (RegionT s pr)) openFile' filePath = openFile filePath mkIOMode -- | Note that: @withFile' filePath = 'withFile' filePath 'mkIOMode'@.-withFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)+withFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) ⇒ FilePath ar → (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α) → pr α@@ -469,8 +484,8 @@ -- 'hFileSize' @hdl@ returns the size of that file in 8-bit bytes. -- -- Wraps: @System.IO.'SIO.hFileSize'@.-hFileSize ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Integer+hFileSize ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Integer hFileSize = wrap E.hFileSize #ifdef __GLASGOW_HASKELL__@@ -478,8 +493,8 @@ -- to @size@ bytes. -- -- Wraps: @System.IO.'SIO.hSetFileSize'@.-hSetFileSize ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → Integer → cr ()+hSetFileSize ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → Integer → cr () hSetFileSize = wrap2 E.hSetFileSize #endif @@ -495,13 +510,13 @@ -- 'hLookAhead' and checking for an EOF exception. -- -- Wraps: @System.IO.'SIO.hIsEOF'@.-hIsEOF ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsEOF ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → cr Bool hIsEOF = wrap E.hIsEOF -- | Generalizes: @System.IO.'SIO.isEOF'@ to any 'MonadIO'. isEOF ∷ MonadIO m ⇒ m Bool-isEOF = liftIO $ E.isEOF+isEOF = liftIO E.isEOF -- ** Buffering operations@@ -523,16 +538,16 @@ -- to be changed. -- -- Wraps: @System.IO.'SIO.hSetBuffering'@.-hSetBuffering ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → BufferMode → cr ()+hSetBuffering ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → BufferMode → cr () hSetBuffering = wrap2 E.hSetBuffering -- | Computation 'hGetBuffering' @hdl@ returns the current buffering mode for -- @hdl@. -- -- Wraps: @System.IO.'SIO.hGetBuffering'@.-hGetBuffering ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr BufferMode+hGetBuffering ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr BufferMode hGetBuffering = wrap E.hGetBuffering -- | The action 'hFlush' @hdl@ causes any items buffered for output in handle@@ -547,8 +562,8 @@ -- under these circumstances. -- -- Wraps: @System.IO.'SIO.hFlush'@.-hFlush ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr ()+hFlush ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)+ ⇒ handle ioMode pr → cr () hFlush = wrap E.hFlush @@ -558,8 +573,8 @@ -- a value of the abstract type 'HandlePosn'. -- -- Wraps: @System.IO.'SIO.hGetPosn'@.-hGetPosn ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr HandlePosn+hGetPosn ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr HandlePosn hGetPosn = wrap E.hGetPosn -- | If a call to 'hGetPosn' @hdl@ returns a position @p@, then computation@@ -592,14 +607,14 @@ -- * 'isPermissionError' if a system resource limit would be exceeded. -- -- Wraps: @System.IO.'SIO.hSeek'@.-hSeek ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → SeekMode → Integer → cr ()+hSeek ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → SeekMode → Integer → cr () hSeek = wrap3 E.hSeek #if !defined(__NHC__) -- | Wraps: @System.IO.'SIO.hTell'@.-hTell ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Integer+hTell ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Integer hTell = wrap E.hTell #endif @@ -611,8 +626,8 @@ -- for testing the correctness of this library. -- -- Wraps: @System.IO.'SIO.hIsOpen'@.-hIsOpen ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsOpen ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hIsOpen = wrap E.hIsOpen -- | Note that this operation should always return 'False' since the @regions@@@ -620,8 +635,8 @@ -- for testing the correctness of this library. -- -- Wraps: @System.IO.'SIO.hIsClosed'@.-hIsClosed ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsClosed ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hIsClosed = wrap E.hIsClosed -- | Note that this operation should always return 'True' for IOModes which have@@ -629,8 +644,8 @@ -- correctness of this library. -- -- Wraps: @System.IO.'SIO.hIsReadable'@.-hIsReadable ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsReadable ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hIsReadable = wrap E.hIsReadable -- | Note that this operation should always return 'True' for IOModes which have@@ -638,13 +653,13 @@ -- correctness of this library. -- -- Wraps: @System.IO.'SIO.hIsWritable'@.-hIsWritable ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsWritable ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hIsWritable = wrap E.hIsWritable -- | Wraps: @System.IO.'SIO.hIsSeekable'@.-hIsSeekable ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsSeekable ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hIsSeekable = wrap E.hIsSeekable @@ -654,22 +669,22 @@ -- | Is the handle connected to a terminal? -- -- Wraps: @System.IO.'SIO.hIsTerminalDevice'@.-hIsTerminalDevice ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hIsTerminalDevice ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hIsTerminalDevice = wrap E.hIsTerminalDevice -- | Set the echoing status of a handle connected to a terminal. -- -- Wraps: @System.IO.'SIO.hSetEcho'@.-hSetEcho ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → Bool → cr ()+hSetEcho ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → Bool → cr () hSetEcho = wrap2 E.hSetEcho -- | Get the echoing status of a handle connected to a terminal. -- -- Wraps: @System.IO.'SIO.hGetEcho'@.-hGetEcho ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hGetEcho ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr Bool hGetEcho = wrap E.hGetEcho #endif @@ -678,8 +693,8 @@ #ifdef __GLASGOW_HASKELL__ -- | Wraps: @System.IO.'SIO.hShow'@.-hShow ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr String+hShow ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr String hShow = wrap E.hShow #endif @@ -707,8 +722,8 @@ -- @safe@ foreign call in this respect. -- -- Wraps: @System.IO.'SIO.hWaitForInput'@.-hWaitForInput ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → Int → cr Bool+hWaitForInput ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → Int → cr Bool hWaitForInput = wrap2 E.hWaitForInput -- | Computation 'hReady' @hdl@ indicates whether at least one item is@@ -719,8 +734,8 @@ -- * 'isEOFError' if the end of file has been reached. -- -- Wraps: @System.IO.'SIO.hReady'@.-hReady ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr Bool+hReady ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → cr Bool hReady = wrap E.hReady -- | Computation 'hGetChar' @hdl@ reads a character from the file or@@ -731,8 +746,8 @@ -- * 'isEOFError' if the end of file has been reached. -- -- Wraps: @System.IO.'SIO.hGetChar'@.-hGetChar ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr Char+hGetChar ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → cr Char hGetChar = wrap E.hGetChar -- | Computation 'hGetLine' @hdl@ reads a line from the file or@@ -748,8 +763,8 @@ -- line is returned. -- -- Wraps: @System.IO.'SIO.hGetLine'@.-hGetLine ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr String+hGetLine ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → cr String hGetLine = wrap E.hGetLine -- | Computation 'hLookAhead' returns the next character from the handle@@ -761,8 +776,8 @@ -- * 'isEOFError' if the end of file has been reached. -- -- Wraps: @System.IO.'SIO.hLookAhead'@.-hLookAhead ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr Char+hLookAhead ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → cr Char hLookAhead = wrap E.hLookAhead -- | Computation 'hGetContents' @hdl@ returns the list of characters@@ -795,8 +810,8 @@ -- * 'isEOFError' if the end of file has been reached. -- -- Wraps: @System.IO.'SIO.hGetContents'@.-hGetContents ∷ (pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)- ⇒ RegionalFileHandle ioMode pr → cr String+hGetContents ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, ReadModes ioMode)+ ⇒ handle ioMode pr → cr String hGetContents = wrap E.hGetContents @@ -813,8 +828,8 @@ -- * 'isPermissionError' if another system resource limit would be exceeded. -- -- Wraps: @System.IO.'SIO.hPutChar'@.-hPutChar ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)- ⇒ RegionalFileHandle ioMode pr → Char → cr ()+hPutChar ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)+ ⇒ handle ioMode pr → Char → cr () hPutChar = wrap2 E.hPutChar -- | Computation 'hPutStr' @hdl s@ writes the string@@ -827,15 +842,15 @@ -- * 'isPermissionError' if another system resource limit would be exceeded. -- -- Wraps: @System.IO.'SIO.hPutStr'@.-hPutStr ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)- ⇒ RegionalFileHandle ioMode pr → String → cr ()+hPutStr ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)+ ⇒ handle ioMode pr → String → cr () hPutStr = wrap2 E.hPutStr -- | The same as 'hPutStr', but adds a newline character. -- -- Wraps: @System.IO.'SIO.hPutStrLn'@.-hPutStrLn ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)- ⇒ RegionalFileHandle ioMode pr → String → cr ()+hPutStrLn ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode)+ ⇒ handle ioMode pr → String → cr () hPutStrLn = wrap2 E.hPutStrLn -- | Computation 'hPrint' @hdl t@ writes the string representation of @t@@@ -849,8 +864,8 @@ -- * 'isPermissionError' if another system resource limit would be exceeded. -- -- Wraps: @System.IO.'SIO.hPrint'@.-hPrint ∷ (pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode, Show α)- ⇒ RegionalFileHandle ioMode pr → α → cr ()+hPrint ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr, WriteModes ioMode, Show α)+ ⇒ handle ioMode pr → α → cr () hPrint = wrap2 E.hPrint @@ -911,7 +926,7 @@ -- characters. (See also 'hSetBinaryMode'.) -- -- This provides a safer replacement for @System.IO.'SIO.openBinaryFile'@.-openBinaryFile ∷ (MonadPeelIO pr, AbsRelClass ar)+openBinaryFile ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ FilePath ar → IOMode ioMode → RegionT s pr@@ -923,7 +938,7 @@ resulting region. This provides a safer replacement for @System.IO.'SIO.withBinaryFile'@. -}-withBinaryFile ∷ (MonadPeelIO pr, AbsRelClass ar)+withBinaryFile ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ FilePath ar → IOMode ioMode → (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α)@@ -933,14 +948,14 @@ -- ** Opening binary files by inferring the IOMode -- | Note that: @openBinaryFile' filePath = 'openBinaryFile' filePath 'mkIOMode'@.-openBinaryFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)+openBinaryFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) ⇒ FilePath ar → RegionT s pr (RegionalFileHandle ioMode (RegionT s pr)) openBinaryFile' filePath = openBinaryFile filePath mkIOMode -- | Note that: @withBinaryFile' filePath = 'withBinaryFile' filePath 'mkIOMode'@.-withBinaryFile' ∷ (MonadPeelIO pr, AbsRelClass ar, MkIOMode ioMode)+withBinaryFile' ∷ (MonadControlIO pr, AbsRelClass ar, MkIOMode ioMode) ⇒ FilePath ar → (∀ s. RegionalFileHandle ioMode (RegionT s pr) → RegionT s pr α) → pr α@@ -955,18 +970,18 @@ -- with 'hSetNewlineMode' with 'noNewlineTranslation'. -- -- Wraps: @System.IO.'SIO.hSetBinaryMode'@.-hSetBinaryMode ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → Bool → cr ()+hSetBinaryMode ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → Bool → cr () hSetBinaryMode = wrap2 E.hSetBinaryMode -- | 'hPutBuf' @hdl buf count@ writes @count@ 8-bit bytes from the -- buffer @buf@ to the handle @hdl@. It returns (). ----- 'hPutBuf' ignores any text encoding that applies to the 'RegionalFileHandle',+-- 'hPutBuf' ignores any text encoding that applies to the handle, -- writing the bytes directly to the underlying file or device. -- -- 'hPutBuf' ignores the prevailing 'TextEncoding' and--- 'NewlineMode' on the 'RegionalFileHandle', and writes bytes directly.+-- 'NewlineMode' on the handle, and writes bytes directly. -- -- This operation may fail with: --@@ -978,19 +993,24 @@ -- Wraps: @System.IO.'SIO.hPutBuf'@. hPutBuf ∷ ( pr1 `AncestorRegion` cr , pr2 `AncestorRegion` cr+ , FileHandle handle+ , AllocatedPointer pointer , MonadIO cr , WriteModes ioMode )- ⇒ RegionalFileHandle ioMode pr1- → RegionalPtr α pr2+ ⇒ handle ioMode pr1+ → pointer α pr2 → Int → cr () hPutBuf = wrapPtr E.hPutBuf -wrapPtr ∷ MonadIO cr+wrapPtr ∷ ∀ (handle ∷ * → (* → *) → *) ioMode (pr1 ∷ * → *)+ (pointer ∷ * → (* → *) → *) α (pr2 ∷ * → *)+ cr β+ . (FileHandle handle, AllocatedPointer pointer, MonadIO cr) ⇒ (Handle ioMode → Ptr α → Int → IO β)- → (RegionalFileHandle ioMode pr1 → RegionalPtr α pr2 → Int → cr β)-wrapPtr f = \h rPtr → liftIO ∘ f (unsafeHandle h) (unsafePtr rPtr)+ → (handle ioMode pr1 → pointer α pr2 → Int → cr β)+wrapPtr f = \h pointer → liftIO ∘ f (unsafeHandle h) (unsafePtr pointer) -- | 'hGetBuf' @hdl buf count@ reads data from the handle @hdl@ -- into the buffer @buf@ until either EOF is reached or@@ -998,7 +1018,7 @@ -- It returns the number of bytes actually read. This may be zero if -- EOF was reached before any data was read (or if @count@ is zero). ----- 'hGetBuf' ignores whatever 'TextEncoding' the 'RegionalFileHandle' is+-- 'hGetBuf' ignores whatever 'TextEncoding' the handle is -- currently using, and reads bytes directly from the underlying IO device. -- -- 'hGetBuf' never raises an EOF exception, instead it returns a value@@ -1008,16 +1028,18 @@ -- is closed, 'hGetBuf' will behave as if EOF was reached. -- -- 'hGetBuf' ignores the prevailing 'TextEncoding' and 'NewlineMode' on the--- 'RegionalFileHandle', and reads bytes directly.+-- handle, and reads bytes directly. -- -- Wraps: @System.IO.'SIO.hGetBuf'@. hGetBuf ∷ ( pr1 `AncestorRegion` cr , pr2 `AncestorRegion` cr+ , FileHandle handle+ , AllocatedPointer pointer , MonadIO cr , ReadModes ioMode )- ⇒ RegionalFileHandle ioMode pr1- → RegionalPtr α pr2+ ⇒ handle ioMode pr1+ → pointer α pr2 → Int → cr Int hGetBuf = wrapPtr E.hGetBuf@@ -1040,16 +1062,18 @@ -- is closed, 'hGetBufSome' will behave as if EOF was reached. -- -- 'hGetBufSome' ignores the prevailing 'TextEncoding' and 'NewlineMode'--- on the 'Handle', and reads bytes directly.+-- on the handle, and reads bytes directly. -- -- Wraps: @System.IO.'SIO.hGetBufSome'@. hGetBufSome ∷ ( pr1 `AncestorRegion` cr , pr2 `AncestorRegion` cr+ , FileHandle handle+ , AllocatedPointer pointer , MonadIO cr , ReadModes ioMode )- ⇒ RegionalFileHandle ioMode pr1- → RegionalPtr α pr2+ ⇒ handle ioMode pr1+ → pointer α pr2 → Int → cr Int hGetBufSome = wrapPtr E.hGetBufSome@@ -1058,11 +1082,13 @@ -- | Wraps: @System.IO.'SIO.hPutBufNonBlocking'@. hPutBufNonBlocking ∷ ( pr1 `AncestorRegion` cr , pr2 `AncestorRegion` cr+ , FileHandle handle+ , AllocatedPointer pointer , MonadIO cr , WriteModes ioMode )- ⇒ RegionalFileHandle ioMode pr1- → RegionalPtr α pr2+ ⇒ handle ioMode pr1+ → pointer α pr2 → Int → cr Int hPutBufNonBlocking = wrapPtr E.hPutBufNonBlocking@@ -1077,23 +1103,25 @@ -- only whatever data is available. To wait for data to arrive before -- calling 'hGetBufNonBlocking', use 'hWaitForInput'. ----- 'hGetBufNonBlocking' ignores whatever 'TextEncoding' the 'RegionalFileHandle'+-- 'hGetBufNonBlocking' ignores whatever 'TextEncoding' the handle -- is currently using, and reads bytes directly from the underlying IO device. -- -- If the handle is a pipe or socket, and the writing end -- is closed, 'hGetBufNonBlocking' will behave as if EOF was reached. -- -- 'hGetBufNonBlocking' ignores the prevailing 'TextEncoding' and 'NewlineMode'--- on the 'RegionalFileHandle', and reads bytes directly.+-- on the handle, and reads bytes directly. -- -- Wraps: @System.IO.'SIO.hGetBufNonBlocking'@. hGetBufNonBlocking ∷ ( pr1 `AncestorRegion` cr , pr2 `AncestorRegion` cr+ , FileHandle handle+ , AllocatedPointer pointer , MonadIO cr , ReadModes ioMode )- ⇒ RegionalFileHandle ioMode pr1- → RegionalPtr α pr2+ ⇒ handle ioMode pr1+ → pointer α pr2 → Int → cr Int hGetBufNonBlocking = wrapPtr E.hGetBufNonBlocking@@ -1110,7 +1138,7 @@ -- where XXX is some random number. type Template = RelFile -openTemp ∷ (MonadPeelIO pr, AbsRelClass ar)+openTemp ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ (E.FilePath → String → IO (E.FilePath, E.Handle ReadWriteMode)) → ( DirPath ar → Template@@ -1118,10 +1146,10 @@ , RegionalFileHandle ReadWriteMode (RegionT s pr) ) )-openTemp open = \dirPath template → block $ do+openTemp open = \dirPath template → mask_ $ do (fp, h) ← liftIO $ open (getPathString dirPath) (getPathString template) ch ← onExit $ sanitizeIOError $ hClose h- return (asAbsFile fp, RegionalFileHandle h $ Just ch)+ return (asAbsFile fp, RegionalFileHandle h ch) -- | The function creates a temporary file in 'ReadWriteMode'. The created file -- isn\'t deleted automatically, so you need to delete it manually.@@ -1138,7 +1166,7 @@ -- so if you rely on this behaviour it is best to use local filesystems only. -- -- This provides a safer replacement for @System.IO.'SIO.openTempFile'@.-openTempFile ∷ (MonadPeelIO pr, AbsRelClass ar)+openTempFile ∷ (MonadControlIO pr, AbsRelClass ar) ⇒ DirPath ar -- ^ Directory in which to create the file. → Template -- ^ File name template. → RegionT s pr ( AbsFile@@ -1151,7 +1179,7 @@ -- -- This provides a safer replacement for @System.IO.'SIO.openBinaryTempFile'@. openBinaryTempFile ∷- (MonadPeelIO pr, AbsRelClass ar)+ (MonadControlIO pr, AbsRelClass ar) ⇒ DirPath ar → Template → RegionT s pr ( AbsFile@@ -1165,7 +1193,7 @@ -- This provides a safer replacement for -- @System.IO.'SIO.openTempFileWithDefaultPermissions'@. openTempFileWithDefaultPermissions ∷- (MonadPeelIO pr, AbsRelClass ar)+ (MonadControlIO pr, AbsRelClass ar) ⇒ DirPath ar → Template → RegionT s pr ( AbsFile@@ -1178,7 +1206,7 @@ -- This provides a safer replacement for -- @System.IO.'SIO.openBinaryTempFileWithDefaultPermissions'@. openBinaryTempFileWithDefaultPermissions ∷- (MonadPeelIO pr, AbsRelClass ar)+ (MonadControlIO pr, AbsRelClass ar) ⇒ DirPath ar → Template → RegionT s pr ( AbsFile@@ -1195,33 +1223,33 @@ -- | The action 'hSetEncoding' @hdl@ @encoding@ changes the text encoding for -- the handle @hdl@ to @encoding@. The default encoding when a--- 'RegionalFileHandle' is created is 'localeEncoding', namely the default+-- handle is created is 'localeEncoding', namely the default -- encoding for the current locale. ----- To create a 'RegionalFileHandle' with no encoding at all, use+-- To create a handle with no encoding at all, use -- 'openBinaryFile'. To stop further encoding or decoding on an existing--- 'RegionalFileHandle', use 'hSetBinaryMode'.+-- handle, use 'hSetBinaryMode'. -- -- 'hSetEncoding' may need to flush buffered data in order to change -- the encoding. -- -- Wraps: @System.IO.'SIO.hSetEncoding'@.-hSetEncoding ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → TextEncoding → cr ()+hSetEncoding ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → TextEncoding → cr () hSetEncoding = wrap2 E.hSetEncoding --- | Return the current 'TextEncoding' for the specified 'RegionalFileHandle',--- or 'Nothing' if the 'Handle' is in binary mode.+-- | Return the current 'TextEncoding' for the specified handle,+-- or 'Nothing' if the handle is in binary mode. -- -- Note that the 'TextEncoding' remembers nothing about the state of the--- encoder/decoder in use on this 'RegionalFileHandle'. For example, if the+-- encoder/decoder in use on this handle. For example, if the -- encoding in use is UTF-16, then using 'hGetEncoding' and 'hSetEncoding' to -- save and restore the encoding may result in an extra byte-order-mark being -- written to the file. -- -- Wraps: @System.IO.'SIO.hGetEncoding'@.-hGetEncoding ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → cr (Maybe TextEncoding)+hGetEncoding ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → cr (Maybe TextEncoding) hGetEncoding = wrap E.hGetEncoding -- | Generalizes @System.IO.'SIO.mkTextEncoding'@ to any 'MonadIO'.@@ -1233,12 +1261,13 @@ -- * Newline conversion -------------------------------------------------------------------------------- --- | Set the 'NewlineMode' on the specified 'RegionalFileHandle'. All buffered--- data is flushed first.+-- | Set the 'NewlineMode' on the specified handle. --+-- All buffered data is flushed first.+-- -- Wraps: @System.IO.'SIO.hSetNewlineMode'@.-hSetNewlineMode ∷ (pr `AncestorRegion` cr, MonadIO cr)- ⇒ RegionalFileHandle ioMode pr → NewlineMode → cr ()+hSetNewlineMode ∷ (FileHandle handle, pr `AncestorRegion` cr, MonadIO cr)+ ⇒ handle ioMode pr → NewlineMode → cr () hSetNewlineMode = wrap2 E.hSetNewlineMode #endif
System/IO/SaferFileHandles/Internal.hs view
@@ -14,7 +14,9 @@ -------------------------------------------------------------------------------- module System.IO.SaferFileHandles.Internal- ( RegionalFileHandle(RegionalFileHandle) ) where+ ( RegionalFileHandle(RegionalFileHandle)+ , FileHandle(unsafeHandle)+ ) where --------------------------------------------------------------------------------@@ -22,12 +24,7 @@ -------------------------------------------------------------------------------- -- from base:-import Control.Monad ( return, liftM )-import Data.Function ( ($) )-import Data.Maybe ( Maybe(Nothing, Just) )---- from base-unicode-symbols:-import Data.Function.Unicode ( (∘) )+import Control.Monad ( liftM ) -- from regions: import Control.Monad.Trans.Region ( Dup(dup) )@@ -48,11 +45,16 @@ -- | A regional handle to an opened file parameterized by the 'IOMode' in which -- you opened the file and the region in which it was created. data RegionalFileHandle ioMode (r ∷ * → *) =- RegionalFileHandle !(Handle ioMode) !(Maybe (FinalizerHandle r))+ RegionalFileHandle !(Handle ioMode) !(FinalizerHandle r) instance Dup (RegionalFileHandle ioMode) where- dup (RegionalFileHandle h Nothing) = return $ RegionalFileHandle h Nothing- dup (RegionalFileHandle h (Just ch)) = liftM (RegionalFileHandle h ∘ Just) $ dup ch+ dup (RegionalFileHandle h ch) = liftM (RegionalFileHandle h) (dup ch)++class FileHandle (handle ∷ * → (* → *) → *) where+ unsafeHandle ∷ handle ioMode r → Handle ioMode++instance FileHandle RegionalFileHandle where+ unsafeHandle (RegionalFileHandle handle _) = handle -- The End ---------------------------------------------------------------------
System/IO/SaferFileHandles/Unsafe.hs view
@@ -38,29 +38,26 @@ import System.IO.ExplicitIOModes ( Handle, IO ) -- from ourselves:-import System.IO.SaferFileHandles.Internal ( RegionalFileHandle(RegionalFileHandle) )+import System.IO.SaferFileHandles.Internal ( FileHandle, unsafeHandle ) -------------------------------------------------------------------------------- -- Getting the actual @Handle@ -------------------------------------------------------------------------------- -unsafeHandle ∷ RegionalFileHandle ioMode r → Handle ioMode-unsafeHandle (RegionalFileHandle h _) = h--wrap ∷ MonadIO m+wrap ∷ (FileHandle handle, MonadIO m) ⇒ (Handle ioMode → IO α)- → (RegionalFileHandle ioMode r → m α)+ → (handle ioMode r → m α) wrap f = \h → liftIO $ sanitizeIOError $ f (unsafeHandle h) -wrap2 ∷ MonadIO m+wrap2 ∷ (FileHandle handle, MonadIO m) ⇒ (Handle ioMode → β → IO α)- → (RegionalFileHandle ioMode r → β → m α)+ → (handle ioMode r → β → m α) wrap2 f = \h y → liftIO $ sanitizeIOError $ f (unsafeHandle h) y -wrap3 ∷ MonadIO m+wrap3 ∷ (FileHandle handle, MonadIO m) ⇒ (Handle ioMode → γ → β → IO α)- → (RegionalFileHandle ioMode r → γ → β → m α)+ → (handle ioMode r → γ → β → m α) wrap3 f = \h z y → liftIO $ sanitizeIOError $ f (unsafeHandle h) z y -- | Modify thrown @IOErrors@ in the given computation by erasing the
safer-file-handles.cabal view
@@ -1,5 +1,5 @@ name: safer-file-handles-version: 0.9+version: 0.10 cabal-version: >=1.6 build-type: Custom license: BSD3@@ -53,12 +53,12 @@ GHC-Options: -Wall build-depends: base >= 4 && < 4.4 , base-unicode-symbols >= 0.1.1 && < 0.3- , regions >= 0.8 && < 0.9+ , regions >= 0.9 && < 0.10 , transformers >= 0.2 && < 0.3- , monad-peel >= 0.1 && < 0.3+ , monad-control >= 0.2 && < 0.3 , explicit-iomodes >= 0.5 && < 0.7 , pathtype >= 0.0.1 && < 0.6- , regional-pointers >= 0.5 && < 0.6+ , regional-pointers >= 0.6 && < 0.7 exposed-modules: System.IO.SaferFileHandles System.IO.SaferFileHandles.Unsafe other-modules: System.IO.SaferFileHandles.Internal