quickcheck-quid-0.0.1.1: src/internal/Internal/Test/QuickCheck/Quid/Combinators/Size.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Internal.Test.QuickCheck.Quid.Combinators.Size
where
import Control.DeepSeq
( NFData )
import Data.Data
( Data )
import Data.Hashable
( Hashable (..) )
import Data.Proxy
( Proxy (..) )
import GHC.Generics
( Generic )
import GHC.TypeLits
( KnownNat, Nat, natVal )
import Test.QuickCheck
( Arbitrary (..), resize, shrinkMapBy )
--------------------------------------------------------------------------------
-- Sizes
--------------------------------------------------------------------------------
newtype Size (n :: Nat) a = Size { unSize :: a }
deriving (Data, Eq, Generic, Hashable, NFData, Ord)
deriving (Read, Show) via a
instance (Arbitrary a, KnownNat n) => Arbitrary (Size n a) where
arbitrary = Size <$> resize (fromIntegral $ natVal $ Proxy @n) arbitrary
shrink = shrinkMapBy Size unSize shrink