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
-}