packages feed

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 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