BSD-3-Clause licensed and maintained by Rudy Matela
This version can be pinned in stack with:leancheck-instances-0.0.3@sha256:3c07ac331efa503fb900705c32fcb5dbcd71a8078528d678c382a676def9f2df,2969


leancheck-instances’s Build Status leancheck-instances on Hackage leancheck-instances on Stackage LTS leancheck-instances on Stackage Nightly

This package extends LeanCheck by providing Listable instances for common types provided by the Haskell Platform.

This package is to LeanCheck what quickcheck-instances is to QuickCheck. The current objective is to include all types supported by quickcheck-instances.


To install the latest leancheck-instances version from Hackage, just run:

$ cabal update
$ cabal install leancheck-instances


Importing the library:

> import Test.LeanCheck
> import Test.LeanCheck.Instances

Checking properties of Text:

> import qualified Data.Text as T
> check $ \t -> T.reverse (T.reverse t) == t
+++ OK, passed 200 tests.
> check $ \t -> T.reverse t == t
*** Failed! Falsifiable (after 6 tests):
"a "

Enumerating Maps:

> import Data.Map
> list :: [Map Bool Bool]
[ fromList []
, fromList [(False,False)]
, fromList [(False,True)]
, fromList [(True,False)]
, fromList [(True,True)]
, fromList [(False,False),(True,False)]
, fromList [(False,False),(True,True)]
, fromList [(False,True),(True,False)]
, fromList [(False,True),(True,True)]
> take 7 $ list :: [Map Int Int]
[ fromList []
, fromList [(0,0)]
, fromList [(0,1)]
, fromList [(1,0)]
, fromList [(0,-1)]
, fromList [(1,1)]
, fromList [(0,0),(1,0)]

Adding more instances

Although the current objective is to include all types supported by quickcheck-instances, leancheck-instances only has about 10% of what is needed. Any help with new instances to increase that percentage will be appreciated.

This section provides a quick guide on how to add new instances.

  1. Choose the type to support Compare the instances provided on quickcheck-instances and leancheck-instances and choose any that has not been added to leancheck-instances yet.

  2. Create the module file if needed If needed, create a module that will contain your instance following the same structure in quickcheck-instances:

     $ cat > src/Test/LeanCheck/Instances/Something.hs
     -- |
     -- Module      : Test.LeanCheck.Instances.Containers
     -- Copyright   : (c) 2019 Authors of leancheck-instances
     -- License     : 3-Clause BSD  (see the file LICENSE)
     -- Maintainer  : Rudy Matela <[email protected]>
     -- 'Listable' something.
     module Test.LeanCheck.Instances.Something () where
     import Test.LeanCheck
     import Something

    Remember to:

    • Import your newly created module on src/Test/LeanCheck/Instances.hs

    • Add your newly created module to the exposed-modules list in leancheck-instances.cabal.

    • You may need to add a package dependency to build-depends on leancheck-instances.cabal.

    • (Optionally) run make depend to update the mk/ file.

  3. Create your instance Open the relevant module with your favourite text editor and add your instance:

     instance ... => Listable Something where

    Check the existing modules and the Listable typeclass documentation for how to create one.

    Make sure your instance builds with cabal build.

  4. Create tests Go into tests/main.hs and add two properties exercising your type, one that holds and one that fails. Make sure the tests pass by running cabal test.

  5. (Optional) Add diff-tests

    • on bench/tiers.hs add an entry for your type;
    • add two matching entries on the diff-test-tiers and update-diff-test-tiers Makefile targets.
    • run make update-diff-test to generate the reference output file.
    • run make test just to make sure the test is working.
  6. Submit a Pull Request Then submit a pull request on GitHub and wait for your build to pass. Alternatively, send a patch via e-mail.

Further reading / see also


Changelog for leancheck-instances


  • Add guide for how to add new Listable instances.
  • Minor improvements in Haddock documentation.
  • Fix minor bug in the Makefile.


  • Listable Set instance;
  • Listable Map instance;
  • Listable IntSet instance;
  • Listable IntMap instance;
  • Some Data.Time instances;
  • Listable Array instance.


  • ByteString instances;
  • Natural instance;
  • Text instance;
  • initial release on Hackage.