# 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