| Safe Haskell | Safe-Inferred | 
|---|---|
| Language | GHC2021 | 
System.FS.BlockIO.Sim
Description
Simulated instances of HasBlockIO and HasFS.
Synopsis
- runSimHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS)
 - runSimErrorHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> Errors -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS, Errors)
 - simHasBlockIO :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
 - simHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
 - simErrorHasBlockIO :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> StrictTVar m Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
 - simErrorHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock)
 - unsafeFromHasFS :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m) => HasFS m HandleMock -> m (HasBlockIO m HandleMock)
 
Implementation details
We include below some documentation about the effects of calling the interface
  functions on the simulated instance of the HasBlockIO interface.
- IO context
 - For uniform behaviour across implementations, the simulation creates and stores a mocked IO context that has the open/closed behaviour that is specified by the interface.
 close- Close the mocked context
 submitIO- Submit a batch of I/O operations using serial I/O using a
      
HasFS hSetNoCache- No-op
 hAdvise- No-op
 hAllocate- No-op
 tryLockFile- Simulate a lock by putting the lock state into the file contents
 hSynchronise- No-op
 synchroniseDirectory- No-op
 createHardLink- Copy all file contents from the source path to the target path. Therefore, this is currently only correctly simulating hard links for immutable files.
 
Runners
runSimHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS) Source #
 runs an runSimHasBlockIO mockFS actionaction using a pair of
 simulated HasFS and HasBlockIO.
The pair of interfaces share the same mocked file system. The initial state
 of the mocked file system is set to mockFs. The final state of the mocked
 file system is returned with the result of action.
If you want to have access to the current state of the mocked file system,
 use simHasBlockIO instead.
runSimErrorHasBlockIO :: (MonadSTM m, PrimMonad m, MonadCatch m, MonadMVar m) => MockFS -> Errors -> (HasFS m HandleMock -> HasBlockIO m HandleMock -> m a) -> m (a, MockFS, Errors) Source #
 runs an runSimErrorHasBlockIO mockFS errors actionaction using a
 pair of simulated HasFS and HasBlockIO that allow fault injection.
The pair of interfaces share the same mocked file system. The initial state
 of the mocked file system is set to mockFs. The final state of the mocked
 file system is returned with the result of action.
The pair of interfaces share the same stream of errors. The initial state of
 the stream of errors is set to errors. The final state of the stream of
 errors is returned with the result of action.
If you want to have access to the current state of the mocked file system
 or stream of errors, use simErrorHasBlockIO instead.
Initialisation
simHasBlockIO :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
 creates a pair of simulated simHasBlockIO mockFsVarHasFS and
 HasBlockIO.
The pair of interfaces share the same mocked file system, which is stored in
 mockFsVar. The current state of the mocked file system can be accessed by
 the user by reading mockFsVar, but note that the user should not leave
 mockFsVar empty.
simHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
 creates a pair of simulated simHasBlockIO mockFsHasFS and
 HasBlockIO that allow fault injection.
The pair of interfaces share the same mocked file system. The initial state
 of the mocked file system is set to mockFs.
If you want to have access to the current state of the mocked file system,
 use simHasBlockIO instead.
simErrorHasBlockIO :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => StrictTMVar m MockFS -> StrictTVar m Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
 creates a pair of simulated
 simErrorHasBlockIO mockFsVar errorsVarHasFS and HasBlockIO that allow fault injection.
The pair of interfaces share the same mocked file system, which is stored in
 mockFsVar. The current state of the mocked file system can be accessed by
 the user by reading mockFsVar, but note that the user should not leave
 mockFsVar empty.
The pair of interfaces share the same stream of errors, which is stored in
 errorsVar. The current state of the stream of errors can be accessed by the
 user by reading errorsVar.
simErrorHasBlockIO' :: (MonadCatch m, MonadMVar m, PrimMonad m, MonadSTM m) => MockFS -> Errors -> m (HasFS m HandleMock, HasBlockIO m HandleMock) Source #
 creates a pair of simulated simErrorHasBlockIO mockFs errorsHasFS
 and HasBlockIO that allow fault injection.
The pair of interfaces share the same mocked file system. The initial state
 of the mocked file system is set to mockFs.
The pair of interfaces share the same stream of errors. The initial state of
 the stream of errors is set to errors.
If you want to have access to the current state of the mocked file system
 or stream of errors, use simErrorHasBlockIO instead.
Unsafe
unsafeFromHasFS :: forall m. (MonadCatch m, MonadMVar m, PrimMonad m) => HasFS m HandleMock -> m (HasBlockIO m HandleMock) Source #
Simulate a HasBlockIO using the given HasFS.
Unsafe
You will probably want to use one of the safe functions like
 runSimHasBlockIO or simErrorHasBlockIO instead.
Only a simulated HasFS, like the simHasFS and simErrorHasFS
 simulations, should be passed to unsafeFromHasFS. Technically, one could
 pass a HasFS for the real file system, but then the resulting
 HasBlockIO would contain a mix of simulated functions and real functions,
 which is probably not what you want.