module System.FS.BlockIO.IO (
    ioHasBlockIO
  , withIOHasBlockIO
  ) where

import           Control.Exception (bracket)
import           System.FS.API (HasFS)
import           System.FS.BlockIO.API (HasBlockIO (..), IOCtxParams)
import qualified System.FS.BlockIO.Internal as I
import           System.FS.IO (HandleIO)

-- | Platform-dependent IO instantiation of 'HasBlockIO'.
ioHasBlockIO ::
     HasFS IO HandleIO
  -> IOCtxParams
  -> IO (HasBlockIO IO HandleIO)
ioHasBlockIO :: HasFS IO HandleIO -> IOCtxParams -> IO (HasBlockIO IO HandleIO)
ioHasBlockIO = HasFS IO HandleIO -> IOCtxParams -> IO (HasBlockIO IO HandleIO)
I.ioHasBlockIO

withIOHasBlockIO ::
     HasFS IO HandleIO
  -> IOCtxParams
  -> (HasBlockIO IO HandleIO -> IO a)
  -> IO a
withIOHasBlockIO :: forall a.
HasFS IO HandleIO
-> IOCtxParams -> (HasBlockIO IO HandleIO -> IO a) -> IO a
withIOHasBlockIO HasFS IO HandleIO
hfs IOCtxParams
params HasBlockIO IO HandleIO -> IO a
action =
    IO (HasBlockIO IO HandleIO)
-> (HasBlockIO IO HandleIO -> IO ())
-> (HasBlockIO IO HandleIO -> IO a)
-> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (HasFS IO HandleIO -> IOCtxParams -> IO (HasBlockIO IO HandleIO)
ioHasBlockIO HasFS IO HandleIO
hfs IOCtxParams
params) (\HasBlockIO{HasCallStack => IO ()
close :: HasCallStack => IO ()
close :: forall (m :: * -> *) h. HasBlockIO m h -> HasCallStack => m ()
close} -> IO ()
HasCallStack => IO ()
close) HasBlockIO IO HandleIO -> IO a
action