# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/).
As a minor extension, we also keep a semantic version for the `UNRELEASED`
changes.
## 3.4.0 - 2024-03-01
* Added some lightweight negative-shrinking based on a simple dependency analysis.
* Added the option to return errors from actions by defining `type Error state`.
When this is defined `perform` has return type `m (Either (Error state) (Realized m a))`,
when it is left as the default the type remains `m (Realized m a)`.
* Changed `withGenQ` to _require_ a predicate when defining a `Quantification`. **Note**: This is technically a breaking change as the interface changed
## 3.3.1
* Adapt code to _not_ constrain [mtl](https://hackage.haskell.org/package/mtl) version too much
## 3.3.0
* Added suppport for GHC 9.6.2 compiler
## 3.2.0
* Added support for negative testing via `validFailingAction` and `postconditionOnFailure`
callbacks in `StateModel` and `RunModel`.
## 3.1.1 - 2023-06-26
* Added instances for `HasVariables` with custom error messages to avoid the issue of
missing `Generic` instances causing difficult to understand type errors.
## 3.1.0 - 2023-04-10
* **BREAKING**: Change the type of `postcondition` to allow you to
express property monitoring (e.g. stats or counterexamples) in the
postcondition itself - rather than duplicating code for counterexamples
in the `monitoring` function.
## 3.0.3 - 2023-04-18
* Added `hasNoVariablesQ` and `forAllNonVariableDL` functions to help make
quantification require less boilerplate in `DL` properties.
## 3.0.2 - 2023-02-17
* Added instances of `HasVariables` for Word types
* Exported definition of `HasNoVariables` to make it useable
with deriving via in downstream packages (whoops!)
* Fixed impossible to use `nextVar` arguments to `forAllUniqueDL`
## 3.0.1 - 2023-02-15
* Remove template haskell dependency
## 3.0.0 - 2023-02-14
* **BREAKING**: Add `HasVariables` class to keep track of symbolic variables and automatically insert precondition
checks for well-scopedness of variables.
* **BREAKING**: Remove some unnecessary and unusead features in dynamic logic, including re-running tests from a
counterexample directly.
* Improved printing of counterexamples in DL - they are now printed as code that can be copied more-or-less verbatim to
create a runnable counterexample in code.
* Made the variable context explicit to avoid having to keep track of symbolic variables in the model
* This introduces the `ctxAtType` and `arbitraryVar` functions to use in action generators (c.f. the
`RegistryModel.hs` example).
## 2.0.0 - 2022-10-11
* **BREAKING**: Add `Realized` type family to distinguish between the model- and real type of an action
* **BREAKING**: Introduce `RunModel` type class to interpret Model-generated sequence of actions against real-world implementation
* Move `perform` method from `StateModel` to this new type-class
* Also split `postcondition` and `monitoring` out from the `StateModel` to the `RunModel` type class
* Added Thread registry example based on io-sim concurrency simulation library
## 1.1.0 - 2022-08-27
* Fix broken links in Hackage-generated documentation and link to other Quviq papers
* Add `Show a` constraint on `monitoring`
## 1.0.0
* Initial publication of quickcheck-dynamic library on Hackage
* Provide base `StateModel` and `DynamicLogic` tools to write quickcheck-based models, express properties, and test them