@hackage io-sim1.9.0.0
A pure simulator for monadic concurrency with STM.
Categories
License
Apache-2.0
Maintainer
Duncan Coutts duncan@well-typed.com, Marcin Szamotulski coot@coot.me
Links
Versions
Installation
Dependencies (13)
- QuickCheck
- base >=4.16 && <4.22
- containers
- deepseq
- exceptions >=0.10
- hashable Show all…
Dependents (7)
@hackage/strict-mvar, @hackage/lsm-tree, @hackage/rawlock, @hackage/typed-session, @hackage/strict-checked-vars, @hackage/delta-store, Show all…
Package Flags
asserts
(off by default)
Enable assertions
IO Simulator Monad: io-sim package
A pure simulator monad built on top of the lazy ST monad which supports:
- optional dynamic race discovery and schedule exploration (see
IOSimPOR) - synchronous and asynchronous exceptions; including: throwing, catching and masking synchronous and asynchronous exceptions;
- concurrency (using simulated threads), with interfaces shaped by the
baseandasynclibraries; - software transactional memory (
STM); - simulated time;
- timeouts;
- dynamically typed traces and event log tracing;
- lifting any
STcomputations; - inspection of
STMmutable data structures; - deadlock detection;
MonadFixinstances for bothIOSimand its correspondingSTMmonad.
io-sim together with io-classes is a drop-in replacement for the IO
monad (with some ramifications). It was designed to write easily testable
Haskell code (including simulating socket programming or disk IO). Using
io-classes and si-timers libraries one can write code that can run in
both: the real IO and the IOSim monad provided by this package. One of the
design goals was to keep the API as close as possible to base, exceptions,
async, and stm packages.
io-sim package also provides two interpreters, a standard one and IOSimPOR
which supports dynamic discovery of race conditions and schedule exploration
with partial order reduction.
io-sim provides API to explore traces produced by a simulation. It can
contain arbitrary Haskell terms, a feature that is very useful to build
property-based tests using QuickCheck.
The package contains thorough tests, including tests of STM against the
original specification (as described in Composable Memory
Transactions
and its GHC implementation. This can be seen in both ways: as a check that
our implementation matches the specification and the GHC implementation, but
also the other way around: that GHCs STM implementation meets the
specification.