1 {-# OPTIONS -#include "HsBase.h" #-}
2 -----------------------------------------------------------------------------
4 -- Module : Data.Array.IO.Internal
5 -- Copyright : (c) The University of Glasgow 2001
6 -- License : BSD-style (see the file libraries/base/LICENSE)
8 -- Maintainer : libraries@haskell.org
9 -- Stability : experimental
10 -- Portability : non-portable
12 -- Mutable boxed and unboxed arrays in the IO monad.
14 -----------------------------------------------------------------------------
16 module Data.Array.IO.Internals (
17 IOArray(..), -- instance of: Eq, Typeable
18 IOUArray(..), -- instance of: Eq, Typeable
23 import Data.Array.MArray
30 import Hugs.IOExts ( unsafeCoerce )
31 import Data.Array.Storable
34 #ifdef __GLASGOW_HASKELL__
35 import Foreign.Ptr ( Ptr, FunPtr )
36 import Foreign.StablePtr ( StablePtr )
37 import Data.Array.Base
39 import GHC.Arr ( STArray )
42 #endif /* __GLASGOW_HASKELL__ */
45 instance HasBounds IOArray where
46 bounds = boundsIOArray
48 instance MArray IOArray e IO where
50 unsafeRead = unsafeReadIOArray
51 unsafeWrite = unsafeWriteIOArray
53 type IOUArray = StorableArray
57 iOArrayTc = mkTyCon "IOArray"
59 instance (Typeable a, Typeable b) => Typeable (IOArray a b) where
60 typeOf a = mkAppTy iOArrayTc [typeOf ((undefined :: IOArray a b -> a) a),
61 typeOf ((undefined :: IOArray a b -> b) a)]
63 #ifdef __GLASGOW_HASKELL__
64 -- GHC only to the end of file
66 -----------------------------------------------------------------------------
67 -- | Instance declarations for 'IOArray's
69 instance HasBounds IOArray where
71 bounds (IOArray marr) = bounds marr
73 instance MArray IOArray e IO where
75 unsafeRead = unsafeReadIOArray
76 unsafeWrite = unsafeWriteIOArray
79 -----------------------------------------------------------------------------
80 -- Flat unboxed mutable arrays (IO monad)
82 -- | Mutable, unboxed, strict arrays in the 'IO' monad. The type
83 -- arguments are as follows:
85 -- * @i@: the index type of the array (should be an instance of @Ix@)
87 -- * @e@: the element type of the array. Only certain element types
88 -- are supported: see 'MArray' for a list of instances.
90 newtype IOUArray i e = IOUArray (STUArray RealWorld i e) deriving Eq
93 iOUArrayTc = mkTyCon "IOUArray"
95 instance (Typeable a, Typeable b) => Typeable (IOUArray a b) where
96 typeOf a = mkAppTy iOUArrayTc [typeOf ((undefined :: IOUArray a b -> a) a),
97 typeOf ((undefined :: IOUArray a b -> b) a)]
99 instance HasBounds IOUArray where
100 {-# INLINE bounds #-}
101 bounds (IOUArray marr) = bounds marr
103 instance MArray IOUArray Bool IO where
104 {-# INLINE newArray #-}
105 newArray lu init = stToIO $ do
106 marr <- newArray lu init; return (IOUArray marr)
107 {-# INLINE newArray_ #-}
108 newArray_ lu = stToIO $ do
109 marr <- newArray_ lu; return (IOUArray marr)
110 {-# INLINE unsafeRead #-}
111 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
112 {-# INLINE unsafeWrite #-}
113 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
115 instance MArray IOUArray Char IO where
116 {-# INLINE newArray #-}
117 newArray lu init = stToIO $ do
118 marr <- newArray lu init; return (IOUArray marr)
119 {-# INLINE newArray_ #-}
120 newArray_ lu = stToIO $ do
121 marr <- newArray_ lu; return (IOUArray marr)
122 {-# INLINE unsafeRead #-}
123 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
124 {-# INLINE unsafeWrite #-}
125 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
127 instance MArray IOUArray Int IO where
128 {-# INLINE newArray #-}
129 newArray lu init = stToIO $ do
130 marr <- newArray lu init; return (IOUArray marr)
131 {-# INLINE newArray_ #-}
132 newArray_ lu = stToIO $ do
133 marr <- newArray_ lu; return (IOUArray marr)
134 {-# INLINE unsafeRead #-}
135 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
136 {-# INLINE unsafeWrite #-}
137 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
139 instance MArray IOUArray Word IO where
140 {-# INLINE newArray #-}
141 newArray lu init = stToIO $ do
142 marr <- newArray lu init; return (IOUArray marr)
143 {-# INLINE newArray_ #-}
144 newArray_ lu = stToIO $ do
145 marr <- newArray_ lu; return (IOUArray marr)
146 {-# INLINE unsafeRead #-}
147 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
148 {-# INLINE unsafeWrite #-}
149 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
151 instance MArray IOUArray (Ptr a) IO where
152 {-# INLINE newArray #-}
153 newArray lu init = stToIO $ do
154 marr <- newArray lu init; return (IOUArray marr)
155 {-# INLINE newArray_ #-}
156 newArray_ lu = stToIO $ do
157 marr <- newArray_ lu; return (IOUArray marr)
158 {-# INLINE unsafeRead #-}
159 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
160 {-# INLINE unsafeWrite #-}
161 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
163 instance MArray IOUArray (FunPtr a) IO where
164 {-# INLINE newArray #-}
165 newArray lu init = stToIO $ do
166 marr <- newArray lu init; return (IOUArray marr)
167 {-# INLINE newArray_ #-}
168 newArray_ lu = stToIO $ do
169 marr <- newArray_ lu; return (IOUArray marr)
170 {-# INLINE unsafeRead #-}
171 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
172 {-# INLINE unsafeWrite #-}
173 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
175 instance MArray IOUArray Float IO where
176 {-# INLINE newArray #-}
177 newArray lu init = stToIO $ do
178 marr <- newArray lu init; return (IOUArray marr)
179 {-# INLINE newArray_ #-}
180 newArray_ lu = stToIO $ do
181 marr <- newArray_ lu; return (IOUArray marr)
182 {-# INLINE unsafeRead #-}
183 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
184 {-# INLINE unsafeWrite #-}
185 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
187 instance MArray IOUArray Double IO where
188 {-# INLINE newArray #-}
189 newArray lu init = stToIO $ do
190 marr <- newArray lu init; return (IOUArray marr)
191 {-# INLINE newArray_ #-}
192 newArray_ lu = stToIO $ do
193 marr <- newArray_ lu; return (IOUArray marr)
194 {-# INLINE unsafeRead #-}
195 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
196 {-# INLINE unsafeWrite #-}
197 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
199 instance MArray IOUArray (StablePtr a) IO where
200 {-# INLINE newArray #-}
201 newArray lu init = stToIO $ do
202 marr <- newArray lu init; return (IOUArray marr)
203 {-# INLINE newArray_ #-}
204 newArray_ lu = stToIO $ do
205 marr <- newArray_ lu; return (IOUArray marr)
206 {-# INLINE unsafeRead #-}
207 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
208 {-# INLINE unsafeWrite #-}
209 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
211 instance MArray IOUArray Int8 IO where
212 {-# INLINE newArray #-}
213 newArray lu init = stToIO $ do
214 marr <- newArray lu init; return (IOUArray marr)
215 {-# INLINE newArray_ #-}
216 newArray_ lu = stToIO $ do
217 marr <- newArray_ lu; return (IOUArray marr)
218 {-# INLINE unsafeRead #-}
219 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
220 {-# INLINE unsafeWrite #-}
221 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
223 instance MArray IOUArray Int16 IO where
224 {-# INLINE newArray #-}
225 newArray lu init = stToIO $ do
226 marr <- newArray lu init; return (IOUArray marr)
227 {-# INLINE newArray_ #-}
228 newArray_ lu = stToIO $ do
229 marr <- newArray_ lu; return (IOUArray marr)
230 {-# INLINE unsafeRead #-}
231 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
232 {-# INLINE unsafeWrite #-}
233 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
235 instance MArray IOUArray Int32 IO where
236 {-# INLINE newArray #-}
237 newArray lu init = stToIO $ do
238 marr <- newArray lu init; return (IOUArray marr)
239 {-# INLINE newArray_ #-}
240 newArray_ lu = stToIO $ do
241 marr <- newArray_ lu; return (IOUArray marr)
242 {-# INLINE unsafeRead #-}
243 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
244 {-# INLINE unsafeWrite #-}
245 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
247 instance MArray IOUArray Int64 IO where
248 {-# INLINE newArray #-}
249 newArray lu init = stToIO $ do
250 marr <- newArray lu init; return (IOUArray marr)
251 {-# INLINE newArray_ #-}
252 newArray_ lu = stToIO $ do
253 marr <- newArray_ lu; return (IOUArray marr)
254 {-# INLINE unsafeRead #-}
255 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
256 {-# INLINE unsafeWrite #-}
257 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
259 instance MArray IOUArray Word8 IO where
260 {-# INLINE newArray #-}
261 newArray lu init = stToIO $ do
262 marr <- newArray lu init; return (IOUArray marr)
263 {-# INLINE newArray_ #-}
264 newArray_ lu = stToIO $ do
265 marr <- newArray_ lu; return (IOUArray marr)
266 {-# INLINE unsafeRead #-}
267 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
268 {-# INLINE unsafeWrite #-}
269 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
271 instance MArray IOUArray Word16 IO where
272 {-# INLINE newArray #-}
273 newArray lu init = stToIO $ do
274 marr <- newArray lu init; return (IOUArray marr)
275 {-# INLINE newArray_ #-}
276 newArray_ lu = stToIO $ do
277 marr <- newArray_ lu; return (IOUArray marr)
278 {-# INLINE unsafeRead #-}
279 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
280 {-# INLINE unsafeWrite #-}
281 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
283 instance MArray IOUArray Word32 IO where
284 {-# INLINE newArray #-}
285 newArray lu init = stToIO $ do
286 marr <- newArray lu init; return (IOUArray marr)
287 {-# INLINE newArray_ #-}
288 newArray_ lu = stToIO $ do
289 marr <- newArray_ lu; return (IOUArray marr)
290 {-# INLINE unsafeRead #-}
291 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
292 {-# INLINE unsafeWrite #-}
293 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
295 instance MArray IOUArray Word64 IO where
296 {-# INLINE newArray #-}
297 newArray lu init = stToIO $ do
298 marr <- newArray lu init; return (IOUArray marr)
299 {-# INLINE newArray_ #-}
300 newArray_ lu = stToIO $ do
301 marr <- newArray_ lu; return (IOUArray marr)
302 {-# INLINE unsafeRead #-}
303 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
304 {-# INLINE unsafeWrite #-}
305 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
307 #endif /* __GLASGOW_HASKELL__ */