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