module Spec.Foldable (testFoldable) where
import Hedgehog
import Hedgehog.Classes
import Data.Set (Set)
import qualified Data.Set as Set
import qualified Data.List as List
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
testFoldable :: [(String, [Laws])]
testFoldable =
[ ("Set", listSet)
-- , ("BadList", listBadList)
]
listSet :: [Laws]
listSet = [foldableLaws genSet]
genSet :: Gen a -> Gen (Set a)
genSet gen = do
x <- gen
pure (Set.singleton x)
listBadList :: [Laws]
listBadList = [foldableLaws genBadList]
genBadList :: Gen a -> Gen (BadList a)
genBadList gen = BadList <$> Gen.list (Range.linear 0 20) gen
newtype BadList a = BadList [a]
deriving (Eq, Show)
instance Foldable BadList where
foldMap f (BadList x) = foldMap f x
foldl' = List.foldl