grenade-0.1.0: test/Test/Hedgehog/TypeLits.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE GADTs #-}
module Test.Hedgehog.TypeLits where
import Data.Constraint
#if __GLASGOW_HASKELL__ < 800
import Data.Proxy
#endif
import Data.Singletons
import qualified Hedgehog.Gen as Gen
import Grenade
import GHC.TypeLits
import GHC.TypeLits.Witnesses
import Test.Hedgehog.Compat
genNat :: Monad m => Gen.Gen m SomeNat
genNat = do
Just n <- someNatVal <$> choose 1 10
return n
#if __GLASGOW_HASKELL__ < 800
type Shape' = ('KProxy :: KProxy Shape)
#else
type Shape' = Shape
#endif
genShape :: Monad m => Gen.Gen m (SomeSing Shape')
genShape
= Gen.choice [
genD1
, genD2
, genD3
]
genD1 :: Monad m => Gen.Gen m (SomeSing Shape')
genD1 = do
n <- genNat
return $ case n of
SomeNat (_ :: Proxy x) -> SomeSing (sing :: Sing ('D1 x))
genD2 :: Monad m => Gen.Gen m (SomeSing Shape')
genD2 = do
n <- genNat
m <- genNat
return $ case (n, m) of
(SomeNat (_ :: Proxy x), SomeNat (_ :: Proxy y)) -> SomeSing (sing :: Sing ('D2 x y))
genD3 :: Monad m => Gen.Gen m (SomeSing Shape')
genD3 = do
n <- genNat
m <- genNat
o <- genNat
return $ case (n, m, o) of
(SomeNat (px :: Proxy x), SomeNat (_ :: Proxy y), SomeNat (pz :: Proxy z)) ->
case natDict px %* natDict pz of
Dict -> SomeSing (sing :: Sing ('D3 x y z))