@@ -26,16 +26,15 @@ main = do
2626 evaluate $ rknf bigMap
2727 defaultMain
2828 [ bench "lookup" $ nf tenLookups bigMap
29− , bench "insert new" $ whnf (\x -> rknf $ insert x bigMap) (111 :: Int)
30− , bench "update old" $ whnf (\x -> rknf $ insert x bigMap) 'b'
29+ , bench "insert new" $ whnf (\x -> rknf $ insert x bigMap) (proxy (111 :: Int))
30+ , bench "update old" $ whnf (\x -> rknf $ insert x bigMap) (proxy 'b')
3131 ]
3232
33−tenLookups :: TypeRepMap
33+tenLookups :: TypeRepMap Proxy
3434 -> ( Proxy (BigProxy 10), Proxy (BigProxy 20)
3535 , Proxy (BigProxy 30), Proxy (BigProxy 40)
3636 , Proxy (BigProxy 50), Proxy (BigProxy 60)
3737 , Proxy (BigProxy 70), Proxy (BigProxy 80)
38− -- , Proxy (BigProxy 9000), Proxy (BigProxy 10000)
3938 )
4039tenLookups tmap = (lp, lp, lp, lp, lp, lp, lp, lp)
4140 where
@@ -43,19 +42,22 @@ tenLookups tmap = (lp, lp, lp, lp, lp, lp, lp, lp)
4342 lp = fromJust $ lookup tmap
4443
4544-- TypeRepMap of 10000 elements
46−bigMap :: TypeRepMap
45+bigMap :: TypeRepMap Proxy
4746bigMap = buildBigMap 10000 (Proxy :: Proxy Z) empty
4847
4948data Z
5049data S a
5150
52−buildBigMap :: forall a . Typeable a => Int -> Proxy a -> TypeRepMap -> TypeRepMap
53−buildBigMap 1 x = insert 'a' . insert x
51+buildBigMap :: forall a . Typeable a => Int -> Proxy a -> TypeRepMap Proxy -> TypeRepMap Proxy
52+buildBigMap 1 x = insert (proxy 'a') . insert x
5453buildBigMap n x = insert x . buildBigMap (n - 1) (Proxy :: Proxy (S a))
5554
56−rknf :: TypeRepMap -> ()
55+rknf :: TypeRepMap f -> ()
5756rknf = rnf . keys
5857
5958type family BigProxy (n :: Nat) :: * where
6059 BigProxy 0 = Z
6160 BigProxy n = S (BigProxy (n - 1))
61+
62+proxy :: a -> Proxy a
63+proxy _ = Proxy