Copyright | (c) 2017-2020 Rudy Matela |
---|---|

License | 3-Clause BSD (see the file LICENSE) |

Maintainer | Rudy Matela <rudy@matela.com.br> |

Safe Haskell | Safe-Inferred |

Language | Haskell2010 |

This module is part of LeanCheck, a simple enumerative property-based testing library.

This module exports functions to compute statistics of Listable instances.

## Synopsis

- classStats :: (Listable a, Show b) => Int -> (a -> b) -> IO ()
- classStatsT :: (Listable a, Show b) => Int -> (a -> b) -> IO ()
- conditionStats :: Listable a => Int -> [(String, a -> Bool)] -> IO ()
- conditionStatsT :: Listable a => Int -> [(String, a -> Bool)] -> IO ()
- classify :: Eq a => [a] -> [[a]]
- classifyBy :: (a -> a -> Bool) -> [a] -> [[a]]
- classifyOn :: Eq b => (a -> b) -> [a] -> [[a]]
- counts :: Eq a => [a] -> [(a, Int)]
- countsBy :: (a -> a -> Bool) -> [a] -> [(a, Int)]
- countsOn :: Eq b => (a -> b) -> [a] -> [(b, Int)]

# Documentation

classStats :: (Listable a, Show b) => Int -> (a -> b) -> IO () Source #

Prints statistics about a given `Listable`

generator
up to a number of test values.

For example, to know the distribution of the length of generated lists, just run:

> classStats 100 (length :: [Int] -> Int) 0: 1/100 1% 1: 6/100 6% 2: 16/100 16% 3: 25/100 25% 4: 26/100 26% 5: 18/100 18% 6: 7/100 7% 7: 1/100 1%

This provides similar functionality to QuickCheck's label, collect, classify and tabulate while keeping statistics separate from your properties.

classStatsT :: (Listable a, Show b) => Int -> (a -> b) -> IO () Source #

Same as `classStats`

, but separated by `tiers`

.

The first argument is the number of tiers to evaluate.

> classStatsT 6 (length :: [Int] -> Int) tot 0 1 2 3 4 5 tot: 32 1 1 2 4 8 16 0: 1 1 0 0 0 0 0 1: 5 0 1 1 1 1 1 2: 10 0 0 1 2 3 4 3: 10 0 0 0 1 3 6 4: 5 0 0 0 0 1 4 5: 1 0 0 0 0 0 1

Lines are values, columns are tiers:

> classStatsT 6 and tot 0 1 2 3 4 5 tot: 63 1 2 4 8 16 32 True: 6 1 1 1 1 1 1 False: 57 0 1 3 7 15 31

conditionStats :: Listable a => Int -> [(String, a -> Bool)] -> IO () Source #

How many values match each of a list of conditions?

How many odd and even numbers are in the `Listable`

enumeration?

> conditionStats 1000 [("odd", odd :: Int -> Bool), ("even", even)] odd: 500/1000 50% even: 500/1000 50%

How many of the generated lists are ordered?

> conditionStats 1000 [("ordered", ordered :: [Int] -> Bool)] ordered: 131/1000 13%

conditionStatsT :: Listable a => Int -> [(String, a -> Bool)] -> IO () Source #

Same as `conditionStats`

but by tier.

The first argument is the number of tiers to evaluate.

How many odd and even numbers are in each tier?

> conditionStatsT 10 [("odd", odd :: Int -> Bool), ("even", even)] total: 1 1 1 1 1 1 1 1 1 1 odd: 0 1 1 0 0 1 1 0 0 1 even: 1 0 0 1 1 0 0 1 1 0

How many ordered lists are in each tier?

> conditionStatsT 10 [("ordered", ordered :: [Int] -> Bool)] total: 1 1 2 4 8 16 32 64 128 256 ordered: 1 1 2 3 5 7 11 15 22 30

classify :: Eq a => [a] -> [[a]] Source #

Classify values using their `Eq`

instance.

> classify [1,2,3,1,2,1] [[1,1,1],[2,2],[3]]

(cf. `classifyBy`

, `classifyOn`

)

classifyBy :: (a -> a -> Bool) -> [a] -> [[a]] Source #

Classify values by a given comparison function.

> classifyBy (\(x,_) (y,_) -> x == y) [(1,1),(1,2),(2,1),(2,2)] [[(1,1),(1,2)],[(2,1),(2,2)]]

(cf. `classify`

, `classifyOn`

)

classifyOn :: Eq b => (a -> b) -> [a] -> [[a]] Source #

Classify values based on the result of a given function.

> classifyOn head ["sheep", "chip", "ship", "cheap"] [["sheep","ship"],["chip","cheap"]]

> classifyOn odd [1,2,3,4,5,6] [[1,3,5],[2,4,6]]

(cf. `classify`

, `classifyBy`

)

counts :: Eq a => [a] -> [(a, Int)] Source #

Returns the counts of each value in a list.

> counts "Mississippi" [('M',1),('i',4),('s',4),('p',2)]

Values are returned in the order they appear.