on master help sign in
Add doubleCapacity as a helper function
commit7897665882bcd646b9732342c82c29392ee4d6b5 authorAndrzej Rybczak <andrzej@rybczak.net> dateFri 11 Jun 2021, 18:15 (5 years ago) parent223f378
1 file changed+9−6
src/Effective/Internal/Env.hs+9−6
src/Effective/Internal/Env.hs+9−6
@@ -92,16 +92,16 @@ unsafeReplaceEnv (Env ref0) (Env ref1) = writeIORef ref0 =<< readIORef ref1
9292unsafeConsEnv :: HasCallStack => e -> Env es -> IO (Env (e : es))
9393unsafeConsEnv e (Env ref) = do
9494 EnvRef n es0 <- readIORef ref
95− let len = sizeofSmallMutableArray es0
96− case n `compare` len of
97− GT -> error $ "n (" ++ show n ++ ") > len (" ++ show len ++ ")"
95+ let len0 = sizeofSmallMutableArray es0
96+ case n `compare` len0 of
97+ GT -> error $ "n (" ++ show n ++ ") > len0 (" ++ show len0 ++ ")"
9898 LT -> do
9999 e `seq` writeSmallArray es0 n (toAny e)
100100 writeIORef ref $! EnvRef (n + 1) es0
101101 EQ -> do
102− let newLen = max 1 len * 2
103− es <- newSmallArray newLen (error "undefined field")
104− copySmallMutableArray es 0 es0 0 len
102+ let len = doubleCapacity len0
103+ es <- newSmallArray len (error "undefined field")
104+ copySmallMutableArray es 0 es0 0 len0
105105 e `seq` writeSmallArray es n (toAny e)
106106 writeIORef ref $! EnvRef (n + 1) es
107107 pure $ Env ref
@@ -184,6 +184,9 @@ unsafeStateEnv f (Env ref) = do
184184----------------------------------------
185185-- Internal helpers
186186
187+doubleCapacity :: Int -> Int
188+doubleCapacity n = max 1 n * 2
189+
187190toAny :: a -> Any
188191toAny = unsafeCoerce
189192