{-# language TypeApplications #-} module Test.QuickCheck.Instances.Enum () where import Data.Enum.Types import Data.Coerce (coerce) import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum) instance Arbitrary A where arbitrary = coerce (arbitrary @(Enumeration A)) shrink = coerce (shrink @(Enumeration A)) instance Arbitrary B where arbitrary = coerce (arbitrary @(Enumeration B)) shrink = coerce (shrink @(Enumeration B)) instance Arbitrary C where arbitrary = coerce (arbitrary @(Enumeration C)) shrink = coerce (shrink @(Enumeration C)) instance Arbitrary D where arbitrary = coerce (arbitrary @(Enumeration D)) shrink = coerce (shrink @(Enumeration D)) instance Arbitrary E where arbitrary = coerce (arbitrary @(Enumeration E)) shrink = coerce (shrink @(Enumeration E)) instance Arbitrary F where arbitrary = coerce (arbitrary @(Enumeration F)) shrink = coerce (shrink @(Enumeration F)) instance Arbitrary G where arbitrary = coerce (arbitrary @(Enumeration G)) shrink = coerce (shrink @(Enumeration G)) instance Arbitrary H where arbitrary = coerce (arbitrary @(Enumeration H)) shrink = coerce (shrink @(Enumeration H)) instance Arbitrary I where arbitrary = coerce (arbitrary @(Enumeration I)) shrink = coerce (shrink @(Enumeration I)) instance Arbitrary J where arbitrary = coerce (arbitrary @(Enumeration J)) shrink = coerce (shrink @(Enumeration J)) instance Arbitrary K where arbitrary = coerce (arbitrary @(Enumeration K)) shrink = coerce (shrink @(Enumeration K)) newtype Enumeration a = Enumeration a instance (Bounded a, Enum a, Eq a) => Arbitrary (Enumeration a) where arbitrary = fmap Enumeration arbitraryBoundedEnum shrink (Enumeration x) = if x == minBound then [] else [Enumeration (pred x)]