module Spec.Monoid (testMonoid, testCommutativeMonoid) where import Hedgehog (Gen) import Hedgehog.Classes import Data.Coerce (coerce) import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import Data.Monoid testMonoid :: [(String, [Laws])] testMonoid = [ ("Sum Integer", lawsSum) , ("Product Integer", lawsProduct) , ("Maybe Integer", lawsMaybe) , ("Ap Maybe Integer", lawsAp) ] testCommutativeMonoid :: [(String, [Laws])] testCommutativeMonoid = [ ("Sum Integer", lawsSum) , ("Product Integer", lawsProduct) , ("Maybe Integer", lawsMaybe) ] lawsSum, lawsProduct, lawsMaybe, lawsAp :: [Laws] lawsSum = [monoidLaws genSum] lawsProduct = [monoidLaws genProduct] lawsMaybe = [monoidLaws genMaybe] lawsAp = [monoidLaws genAp] genInteger :: Gen Integer genInteger = Gen.integral (Range.linear (-3) 20) genSum :: Gen (Sum Integer) genSum = fmap coerce genInteger genProduct :: Gen (Product Integer) genProduct = fmap coerce genInteger genMaybe :: Gen (Maybe (Sum Integer)) genMaybe = Gen.maybe genSum genAp :: Gen (Ap Maybe (Sum Integer)) genAp = fmap coerce genMaybe