1{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE RankNTypes #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
6module Main (main) where
14import Data.Proxy (Proxy (..))
15import Data.Tagged (Tagged (..))
17import Data.Aeson.Types (fromJSONKeyCoerce)
18import qualified Data.ByteString.Lazy as LBS
19import qualified Data.HashMap.Strict as HM
20import qualified Data.Map as M
21import qualified Data.Text as T
23value :: Int -> HM.HashMap T.Text T.Text
24value n = HM.fromList $ map f [1..n]
26 f m = let t = T.pack (show m) in (t, t)
28-------------------------------------------------------------------------------
30-------------------------------------------------------------------------------
32instance Hashable b => Hashable (Tagged a b) where
33 hashWithSalt salt (Tagged a) = hashWithSalt salt a
35-------------------------------------------------------------------------------
37-------------------------------------------------------------------------------
42instance NFData T1 where
44instance Hashable T1 where
45 hashWithSalt salt (T1 t) = hashWithSalt salt t
47instance FromJSON T1 where
48 parseJSON = withText "T1" $ pure . T1
49instance FromJSONKey T1 where
50 fromJSONKey = FromJSONKeyText T1
52-------------------------------------------------------------------------------
54-------------------------------------------------------------------------------
59instance NFData T2 where
61instance Hashable T2 where
62 hashWithSalt salt (T2 t) = hashWithSalt salt t
64instance FromJSON T2 where
65 parseJSON = withText "T2" $ pure . T2
66instance FromJSONKey T2 where
67 fromJSONKey = fromJSONKeyCoerce
69-------------------------------------------------------------------------------
71-------------------------------------------------------------------------------
76instance NFData T3 where
78instance Hashable T3 where
79 hashWithSalt salt (T3 t) = hashWithSalt salt t
81instance FromJSON T3 where
82 parseJSON = withText "T3" $ pure . T3
83instance FromJSONKey T3 where
84 fromJSONKey = FromJSONKeyTextParser (pure . T3)
86-------------------------------------------------------------------------------
88-------------------------------------------------------------------------------
90value10, value100, value1000, value10000 :: HM.HashMap T.Text T.Text
94value10000 = value 10000
96encodedValue10 :: LBS.ByteString
97encodedValue10 = encode value10
99encodedValue100 :: LBS.ByteString
100encodedValue100 = encode value100
102encodedValue1000 :: LBS.ByteString
103encodedValue1000 = encode value1000
105encodedValue10000 :: LBS.ByteString
106encodedValue10000 = encode value10000
108-------------------------------------------------------------------------------
110-------------------------------------------------------------------------------
113 :: (FromJSON (HM.HashMap k T.Text), Eq k, Hashable k)
114 => Proxy k -> LBS.ByteString -> Maybe (HM.HashMap k T.Text)
118 :: (FromJSON (M.Map k T.Text), Ord k)
119 => Proxy k -> LBS.ByteString -> Maybe (M.Map k T.Text)
122proxyText :: Proxy T.Text
134proxyTagged :: Proxy a -> Proxy (Tagged () a)
137-------------------------------------------------------------------------------
139-------------------------------------------------------------------------------
145benchDecodeHM name val = bgroup name
146 [ bench "Text" $ nf (decodeHM proxyText) val
147 , bench "Identity" $ nf (decodeHM proxyT1) val
148 , bench "Coerce" $ nf (decodeHM proxyT2) val
149 , bench "Parser" $ nf (decodeHM proxyT3) val
150 , bench "Tagged Text" $ nf (decodeHM $ proxyTagged proxyText) val
151 , bench "Tagged Identity" $ nf (decodeHM $ proxyTagged proxyT1) val
152 , bench "Tagged Coerce" $ nf (decodeHM $ proxyTagged proxyT2) val
153 , bench "Tagged Parser" $ nf (decodeHM $ proxyTagged proxyT3) val
160benchDecodeMap name val = bgroup name
161 [ bench "Text" $ nf (decodeMap proxyText) val
162 , bench "Identity" $ nf (decodeMap proxyT1) val
163 , bench "Coerce" $ nf (decodeMap proxyT2) val
164 , bench "Parser" $ nf (decodeMap proxyT3) val
169 -> HM.HashMap T.Text T.Text
171benchEncodeHM name val = bgroup name
172 [ bench "Text" $ nf encode val
177 -> HM.HashMap T.Text T.Text
179benchEncodeMap name val = bgroup name
180 [ bench "Text" $ nf encode val'
183 val' :: M.Map T.Text T.Text
184 val' = M.fromList . HM.toList $ val
190 [ benchDecodeHM "10" encodedValue10
191 , benchDecodeHM "100" encodedValue100
192 , benchDecodeHM "1000" encodedValue1000
193 , benchDecodeHM "10000" encodedValue10000
196 [ benchDecodeMap "10" encodedValue10
197 , benchDecodeMap "100" encodedValue100
198 , benchDecodeMap "1000" encodedValue1000
199 , benchDecodeMap "10000" encodedValue10000
204 [ benchEncodeHM "100" value100
205 , benchEncodeHM "1000" value1000
206 , benchEncodeHM "10000" value10000
209 [ benchEncodeMap "100" value100
210 , benchEncodeMap "1000" value1000
211 , benchEncodeMap "10000" value10000
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list