packages feed

quickspec-0.9: examples/Lists.hs

{-# LANGUAGE ScopedTypeVariables #-}

import Test.QuickSpec hiding (lists)
import Test.QuickCheck
import Data.Typeable

lists :: forall a. (Typeable a, Ord a, Arbitrary a, CoArbitrary a) =>
         a -> [Sig]
lists a = [
  arith (undefined :: Int),
  funs (undefined :: a),

  ["x", "y", "z"] `vars` (undefined :: a),
  ["xs", "ys", "zs"] `vars` (undefined :: [a]),

  "[]"      `fun0` ([]      :: [a]),
  ":"       `fun2` ((:)     :: a -> [a] -> [a]),
  "head"    `fun1` (head    :: [a] -> a),
  "tail"    `fun1` (tail    :: [a] -> [a]),
  "unit"    `fun1` (return  :: a -> [a]),
  "++"      `fun2` ((++)    :: [a] -> [a] -> [a]),
  "length"  `fun1` (length  :: [a] -> Int),
  "reverse" `fun1` (reverse :: [a] -> [a]),
  "map"     `fun2` (map     :: (a -> a) -> [a] -> [a])
  ]

main = quickSpec (lists (undefined :: A))