@@ -6,31 +6,27 @@
6{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE TypeFamilies #-}
7{-# LANGUAGE TypeOperators #-}
7{-# LANGUAGE TypeOperators #-}
8{-# LANGUAGE UndecidableInstances #-}
8{-# LANGUAGE UndecidableInstances #-}
9−{-# LANGUAGE ViewPatterns #-}
11−{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver -fno-warn-orphans #-}
10+{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
13module DMap
12module DMap
17−import Criterion.Main (bench, nf, whnf, env)
16+import Criterion.Main (bench, env, nf, whnf)
19import Prelude hiding (lookup)
18import Prelude hiding (lookup)
22−import Control.DeepSeq (NFData(..))
20+import Control.DeepSeq (NFData (..))
23import Data.Maybe (fromJust)
21import Data.Maybe (fromJust)
24import Data.Proxy (Proxy (..))
22import Data.Proxy (Proxy (..))
25−import Data.Type.Equality ((:~:) (..))
26import GHC.TypeLits
23import GHC.TypeLits
27import Type.Reflection (TypeRep, Typeable, typeRep)
25import Type.Reflection (TypeRep, Typeable, typeRep)
28import Type.Reflection.Unsafe (typeRepFingerprint)
26import Type.Reflection.Unsafe (typeRepFingerprint)
29−import Unsafe.Coerce (unsafeCoerce)
31import Data.Dependent.Map (DMap, empty, insert, keys, lookup)
28import Data.Dependent.Map (DMap, empty, insert, keys, lookup)
32−import Data.GADT.Compare (GCompare (..), GEq (..), GOrdering (..))
29+import Data.Some (Some (Some))
33−import Data.Some (Some (This))
35type TypeRepMap = DMap TypeRep
31type TypeRepMap = DMap TypeRep
@@ -40,7 +36,7 @@ spec = BenchSpec
40 { benchLookup = Just $ \name ->
36 { benchLookup = Just $ \name ->
41 env mkBigMap $ \ ~(DMapNF bigMap) ->
37 env mkBigMap $ \ ~(DMapNF bigMap) ->
42 bench name $ nf tenLookups bigMap
38 bench name $ nf tenLookups bigMap
43− , benchInsertSmall = Just $ \name ->
39+ , benchInsertSmall = Just $ \name ->
44 bench name $ whnf (inserts empty 10) (Proxy @ 99999)
40 bench name $ whnf (inserts empty 10) (Proxy @ 99999)
45 , benchInsertBig = Just $ \name ->
41 , benchInsertBig = Just $ \name ->
46 env mkBigMap $ \ ~(DMapNF bigMap) ->
42 env mkBigMap $ \ ~(DMapNF bigMap) ->
@@ -86,20 +82,5 @@ buildBigMap n x = insert (typeRep @a) x
86newtype DMapNF f = DMapNF (TypeRepMap f)
82newtype DMapNF f = DMapNF (TypeRepMap f)
88instance NFData (DMapNF f) where
84instance NFData (DMapNF f) where
89− rnf (DMapNF x) =
85+ rnf (DMapNF x) =
90− rnf . map (\(This t) -> typeRepFingerprint t) $ keys x
86+ rnf . map (\(Some t) -> typeRepFingerprint t) $ keys x
92−instance GEq TypeRep where
93− geq :: TypeRep a -> TypeRep b -> Maybe (a :~: b)
94− geq (typeRepFingerprint -> a) (typeRepFingerprint -> b) =
96− then Just $ unsafeCoerce Refl
99−instance GCompare TypeRep where
100− gcompare :: TypeRep a -> TypeRep b -> GOrdering a b
101− gcompare (typeRepFingerprint -> a) (typeRepFingerprint -> b) =
103− EQ -> unsafeCoerce GEQ