@@ -10,15 +10,12 @@ module Effectful.Internal.Env
1010 , emptyEnv
1111 , cloneEnv
1212 , sizeEnv
13− , takeLastEnv
1413 , getEnv
1514 , checkSizeEnv
1615
1716 -- * Extending and shrinking
18− , unsafeReplaceEnv
1917 , unsafeConsEnv
20− , unsafeAppendEnv
21− , unsafeTrimEnv
18+ , unsafeTailEnv
2219
2320 -- * Data retrieval and update
2421 , unsafePutEnv
@@ -61,14 +58,6 @@ sizeEnv (Env ref) = do
6158 EnvRef n _ <- readIORef ref
6259 pure n
6360
64−-- | Take last @k@ values from the top of the environment.
65−takeLastEnv :: HasCallStack => Int -> Env es0 -> IO (Env es)
66−takeLastEnv k (Env ref) = do
67− EnvRef n es <- readIORef ref
68− if k > n
69− then error $ "k (" ++ show k ++ ") > n (" ++ show n ++ ")"
70− else fmap Env . newIORef . EnvRef k =<< cloneSmallMutableArray es (n - k) k
71−
7261-- | Extract a specific data type from the environment.
7362getEnv :: forall e es. (HasCallStack, e :> es) => Env es -> IO e
7463getEnv (Env ref) = do
@@ -84,11 +73,7 @@ checkSizeEnv k (Env ref) = do
8473----------------------------------------
8574-- Extending and shrinking
8675
87−-- | Replace the first argument with the second one in place.
88−unsafeReplaceEnv :: HasCallStack => Env es -> Env es -> IO ()
89−unsafeReplaceEnv (Env ref0) (Env ref1) = writeIORef ref0 =<< readIORef ref1
90−
91−-- | Extend the environment with a new data type in place.
76+-- | Extend the environment with a new data type (in place).
9277unsafeConsEnv :: HasCallStack => e -> Env es -> IO (Env (e : es))
9378unsafeConsEnv e (Env ref) = do
9479 EnvRef n es0 <- readIORef ref
@@ -107,47 +92,23 @@ unsafeConsEnv e (Env ref) = do
10792 pure $ Env ref
10893{-# NOINLINE unsafeConsEnv #-}
10994
110−-- | Extend the first environment with the second one in place.
111−unsafeAppendEnv :: HasCallStack => Env es0 -> Env es1 -> IO (Env es)
112−unsafeAppendEnv (Env ref0) (Env ref1) = do
113− EnvRef n0 es0 <- readIORef ref0
114− EnvRef n1 es1 <- readIORef ref1
115− let n = n0 + n1
116− if n <= sizeofSmallMutableArray es0
117− then do
118− copySmallMutableArray es0 n0 es1 0 n1
119− writeIORef ref0 $! EnvRef n es0
120− pure $ Env ref0
121− else do
122− es <- newSmallArray n (error "undefined field")
123− copySmallMutableArray es 0 es0 0 n0
124− copySmallMutableArray es n0 es1 0 n1
125− writeIORef ref0 $! EnvRef n es
126− pure $ Env ref0
127−{-# NOINLINE unsafeAppendEnv #-}
128−
129−-- | Trim the environment to the given size in place.
130−unsafeTrimEnv :: HasCallStack => Int -> Env es -> IO (Env es0)
131−unsafeTrimEnv k (Env ref) = do
95+-- | Shrink the environment by one data type (in place). Makes sure the size of
96+-- the environment is as expected.
97+unsafeTailEnv :: HasCallStack => Int -> Env (e : es) -> IO (Env es)
98+unsafeTailEnv k (Env ref) = do
13299 EnvRef n es <- readIORef ref
133− if k > n
134− then error $ "k (" ++ show k ++ ") > n (" ++ show n ++ ")"
100+ if k /= n - 1
101+ then error $ "k (" ++ show k ++ ") /= n - 1 (" ++ show (n - 1) ++ ")"
135102 else do
136− overwrite es k (n - k)
103+ writeSmallArray es k (error "undefined field")
137104 writeIORef ref $! EnvRef k es
138105 pure $ Env ref
139− where
140− overwrite es base = \case
141− 0 -> pure ()
142− i -> do
143− writeSmallArray es (base + i - 1) (error "undefined field")
144− overwrite es base (i - 1)
145−{-# NOINLINE unsafeTrimEnv #-}
106+{-# NOINLINE unsafeTailEnv #-}
146107
147108----------------------------------------
148109-- Data retrieval and update
149110
150−-- | Replace the data type in the environment with a new value in place.
111+-- | Replace the data type in the environment with a new value (in place).
151112unsafePutEnv
152113 :: forall e es. (HasCallStack, e :> es)
153114 => e
@@ -157,7 +118,7 @@ unsafePutEnv e (Env ref) = do
157118 EnvRef n es <- readIORef ref
158119 e `seq` writeSmallArray es (ixEnv @e @es n) (toAny e)
159120
160−-- | Modify the data type in the environment in place.
121+-- | Modify the data type in the environment (in place).
161122unsafeModifyEnv
162123 :: forall e es. (HasCallStack, e :> es)
163124 => (e -> e)
@@ -169,7 +130,7 @@ unsafeModifyEnv f (Env ref) = do
169130 e <- f . fromAny <$> readSmallArray es i
170131 e `seq` writeSmallArray es i (toAny e)
171132
172−-- | Modify the data type in the enviroment in place and return a value.
133+-- | Modify the data type in the enviroment (in place) and return a value.
173134unsafeStateEnv
174135 :: forall e es a. (HasCallStack, e :> es)
175136 => (e -> (a, e))