@@ -23,15 +23,13 @@ module Data.TypeRepMap.Internal where
23
23
24
24
import Prelude hiding (lookup )
25
25
26
- import Control.Monad.ST (runST )
26
+ import Control.Monad.ST (ST , runST )
27
27
import Control.Monad.Zip (mzip )
28
28
import Data.Function (on )
29
- import Data.IntMap.Strict (IntMap )
30
29
import Data.Kind (Type )
31
30
import Data.List (intercalate , nubBy )
32
- import Data.Maybe (fromJust )
33
- import Data.Primitive.Array (Array , freezeArray , indexArray , mapArray' , readArray , sizeofArray ,
34
- thawArray , writeArray )
31
+ import Data.Primitive.Array (Array , MutableArray , indexArray , mapArray' , readArray , sizeofArray ,
32
+ thawArray , unsafeFreezeArray , writeArray )
35
33
import Data.Primitive.PrimArray (PrimArray , indexPrimArray , sizeofPrimArray )
36
34
import Data.Semigroup (Semigroup (.. ))
37
35
import GHC.Base (Any , Int (.. ), Int #, (*#) , (+#) , (<#) )
@@ -43,7 +41,6 @@ import Type.Reflection (SomeTypeRep (..), TypeRep, Typeable, typeRep, withTypeab
43
41
import Type.Reflection.Unsafe (typeRepFingerprint )
44
42
import Unsafe.Coerce (unsafeCoerce )
45
43
46
- import qualified Data.IntMap.Strict as IM
47
44
import qualified Data.Map.Strict as Map
48
45
import qualified GHC.Exts as GHC (fromList , toList )
49
46
@@ -183,7 +180,7 @@ adjust fun tr = case cachedBinarySearch (typeFp @a) (fingerprintAs tr) (fingerpr
183
180
mutArr <- thawArray trAs 0 n
184
181
a <- toAny . fun . fromAny <$> readArray mutArr i
185
182
writeArray mutArr i a
186
- freezeArray mutArr 0 n
183
+ unsafeFreezeArray mutArr
187
184
{-# INLINE adjust #-}
188
185
189
186
{- | Map over the elements of a 'TypeRepMap'.
@@ -390,14 +387,22 @@ fromTriples kvs = TypeRepMap (GHC.fromList fpAs) (GHC.fromList fpBs) (GHC.fromLi
390
387
----------------------------------------------------------------------------
391
388
392
389
fromSortedList :: forall a . [a ] -> [a ]
393
- fromSortedList l = IM. elems $ fst $ go 0 0 mempty (IM. fromList $ zip [0 .. ] l)
390
+ fromSortedList l = runST $ do
391
+ let n = length l
392
+ let arrOrigin = fromListN n l
393
+ arrResult <- thawArray arrOrigin 0 n
394
+ go n arrResult arrOrigin
395
+ toList <$> unsafeFreezeArray arrResult
394
396
where
395
397
-- state monad could be used here, but it's another dependency
396
- go :: Int -> Int -> IntMap a -> IntMap a -> (IntMap a , Int )
397
- go i first result vector =
398
- if i >= IM. size vector
399
- then (result, first)
400
- else do
401
- let (newResult, newFirst) = go (2 * i + 1 ) first result vector
402
- let withCur = IM. insert i (fromJust $ IM. lookup newFirst vector) newResult
403
- go (2 * i + 2 ) (newFirst + 1 ) withCur vector
398
+ go :: forall s . Int -> MutableArray s a -> Array a -> ST s ()
399
+ go len result origin = () <$ loop 0 0
400
+ where
401
+ loop :: Int -> Int -> ST s Int
402
+ loop i first =
403
+ if i >= len
404
+ then pure first
405
+ else do
406
+ newFirst <- loop (2 * i + 1 ) first
407
+ writeArray result i (indexArray origin newFirst)
408
+ loop (2 * i + 2 ) (newFirst + 1 )
0 commit comments