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 iOArrayTc = mkTyCon "IOArray"
47 instance (Typeable a, Typeable b) => Typeable (IOArray a b) where
48 typeOf a = mkAppTy iOArrayTc [typeOf ((undefined :: IOArray a b -> a) a),
49 typeOf ((undefined :: IOArray a b -> b) a)]
51 -----------------------------------------------------------------------------
52 -- | Instance declarations for 'IOArray's
54 #ifdef __GLASGOW_HASKELL__
55 instance HasBounds IOArray where
57 bounds (IOArray marr) = bounds marr
61 instance HasBounds IOArray where
62 bounds = boundsIOArray
65 instance MArray IOArray e IO where
67 unsafeRead = unsafeReadIOArray
68 unsafeWrite = unsafeWriteIOArray
72 type IOUArray = StorableArray
75 #ifdef __GLASGOW_HASKELL__
76 -- GHC only to the end of file
78 -----------------------------------------------------------------------------
79 -- Flat unboxed mutable arrays (IO monad)
81 -- | Mutable, unboxed, strict arrays in the 'IO' monad. The type
82 -- arguments are as follows:
84 -- * @i@: the index type of the array (should be an instance of @Ix@)
86 -- * @e@: the element type of the array. Only certain element types
87 -- are supported: see 'MArray' for a list of instances.
89 newtype IOUArray i e = IOUArray (STUArray RealWorld i e) deriving Eq
92 iOUArrayTc = mkTyCon "IOUArray"
94 instance (Typeable a, Typeable b) => Typeable (IOUArray a b) where
95 typeOf a = mkAppTy iOUArrayTc [typeOf ((undefined :: IOUArray a b -> a) a),
96 typeOf ((undefined :: IOUArray a b -> b) a)]
98 instance HasBounds IOUArray where
100 bounds (IOUArray marr) = bounds marr
102 instance MArray IOUArray Bool IO where
103 {-# INLINE newArray #-}
104 newArray lu init = stToIO $ do
105 marr <- newArray lu init; return (IOUArray marr)
106 {-# INLINE newArray_ #-}
107 newArray_ lu = stToIO $ do
108 marr <- newArray_ lu; return (IOUArray marr)
109 {-# INLINE unsafeRead #-}
110 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
111 {-# INLINE unsafeWrite #-}
112 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
114 instance MArray IOUArray Char IO where
115 {-# INLINE newArray #-}
116 newArray lu init = stToIO $ do
117 marr <- newArray lu init; return (IOUArray marr)
118 {-# INLINE newArray_ #-}
119 newArray_ lu = stToIO $ do
120 marr <- newArray_ lu; return (IOUArray marr)
121 {-# INLINE unsafeRead #-}
122 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
123 {-# INLINE unsafeWrite #-}
124 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
126 instance MArray IOUArray Int IO where
127 {-# INLINE newArray #-}
128 newArray lu init = stToIO $ do
129 marr <- newArray lu init; return (IOUArray marr)
130 {-# INLINE newArray_ #-}
131 newArray_ lu = stToIO $ do
132 marr <- newArray_ lu; return (IOUArray marr)
133 {-# INLINE unsafeRead #-}
134 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
135 {-# INLINE unsafeWrite #-}
136 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
138 instance MArray IOUArray Word IO where
139 {-# INLINE newArray #-}
140 newArray lu init = stToIO $ do
141 marr <- newArray lu init; return (IOUArray marr)
142 {-# INLINE newArray_ #-}
143 newArray_ lu = stToIO $ do
144 marr <- newArray_ lu; return (IOUArray marr)
145 {-# INLINE unsafeRead #-}
146 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
147 {-# INLINE unsafeWrite #-}
148 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
150 instance MArray IOUArray (Ptr a) IO where
151 {-# INLINE newArray #-}
152 newArray lu init = stToIO $ do
153 marr <- newArray lu init; return (IOUArray marr)
154 {-# INLINE newArray_ #-}
155 newArray_ lu = stToIO $ do
156 marr <- newArray_ lu; return (IOUArray marr)
157 {-# INLINE unsafeRead #-}
158 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
159 {-# INLINE unsafeWrite #-}
160 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
162 instance MArray IOUArray (FunPtr a) IO where
163 {-# INLINE newArray #-}
164 newArray lu init = stToIO $ do
165 marr <- newArray lu init; return (IOUArray marr)
166 {-# INLINE newArray_ #-}
167 newArray_ lu = stToIO $ do
168 marr <- newArray_ lu; return (IOUArray marr)
169 {-# INLINE unsafeRead #-}
170 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
171 {-# INLINE unsafeWrite #-}
172 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
174 instance MArray IOUArray Float IO where
175 {-# INLINE newArray #-}
176 newArray lu init = stToIO $ do
177 marr <- newArray lu init; return (IOUArray marr)
178 {-# INLINE newArray_ #-}
179 newArray_ lu = stToIO $ do
180 marr <- newArray_ lu; return (IOUArray marr)
181 {-# INLINE unsafeRead #-}
182 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
183 {-# INLINE unsafeWrite #-}
184 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
186 instance MArray IOUArray Double IO where
187 {-# INLINE newArray #-}
188 newArray lu init = stToIO $ do
189 marr <- newArray lu init; return (IOUArray marr)
190 {-# INLINE newArray_ #-}
191 newArray_ lu = stToIO $ do
192 marr <- newArray_ lu; return (IOUArray marr)
193 {-# INLINE unsafeRead #-}
194 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
195 {-# INLINE unsafeWrite #-}
196 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
198 instance MArray IOUArray (StablePtr a) IO where
199 {-# INLINE newArray #-}
200 newArray lu init = stToIO $ do
201 marr <- newArray lu init; return (IOUArray marr)
202 {-# INLINE newArray_ #-}
203 newArray_ lu = stToIO $ do
204 marr <- newArray_ lu; return (IOUArray marr)
205 {-# INLINE unsafeRead #-}
206 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
207 {-# INLINE unsafeWrite #-}
208 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
210 instance MArray IOUArray Int8 IO where
211 {-# INLINE newArray #-}
212 newArray lu init = stToIO $ do
213 marr <- newArray lu init; return (IOUArray marr)
214 {-# INLINE newArray_ #-}
215 newArray_ lu = stToIO $ do
216 marr <- newArray_ lu; return (IOUArray marr)
217 {-# INLINE unsafeRead #-}
218 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
219 {-# INLINE unsafeWrite #-}
220 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
222 instance MArray IOUArray Int16 IO where
223 {-# INLINE newArray #-}
224 newArray lu init = stToIO $ do
225 marr <- newArray lu init; return (IOUArray marr)
226 {-# INLINE newArray_ #-}
227 newArray_ lu = stToIO $ do
228 marr <- newArray_ lu; return (IOUArray marr)
229 {-# INLINE unsafeRead #-}
230 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
231 {-# INLINE unsafeWrite #-}
232 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
234 instance MArray IOUArray Int32 IO where
235 {-# INLINE newArray #-}
236 newArray lu init = stToIO $ do
237 marr <- newArray lu init; return (IOUArray marr)
238 {-# INLINE newArray_ #-}
239 newArray_ lu = stToIO $ do
240 marr <- newArray_ lu; return (IOUArray marr)
241 {-# INLINE unsafeRead #-}
242 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
243 {-# INLINE unsafeWrite #-}
244 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
246 instance MArray IOUArray Int64 IO where
247 {-# INLINE newArray #-}
248 newArray lu init = stToIO $ do
249 marr <- newArray lu init; return (IOUArray marr)
250 {-# INLINE newArray_ #-}
251 newArray_ lu = stToIO $ do
252 marr <- newArray_ lu; return (IOUArray marr)
253 {-# INLINE unsafeRead #-}
254 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
255 {-# INLINE unsafeWrite #-}
256 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
258 instance MArray IOUArray Word8 IO where
259 {-# INLINE newArray #-}
260 newArray lu init = stToIO $ do
261 marr <- newArray lu init; return (IOUArray marr)
262 {-# INLINE newArray_ #-}
263 newArray_ lu = stToIO $ do
264 marr <- newArray_ lu; return (IOUArray marr)
265 {-# INLINE unsafeRead #-}
266 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
267 {-# INLINE unsafeWrite #-}
268 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
270 instance MArray IOUArray Word16 IO where
271 {-# INLINE newArray #-}
272 newArray lu init = stToIO $ do
273 marr <- newArray lu init; return (IOUArray marr)
274 {-# INLINE newArray_ #-}
275 newArray_ lu = stToIO $ do
276 marr <- newArray_ lu; return (IOUArray marr)
277 {-# INLINE unsafeRead #-}
278 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
279 {-# INLINE unsafeWrite #-}
280 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
282 instance MArray IOUArray Word32 IO where
283 {-# INLINE newArray #-}
284 newArray lu init = stToIO $ do
285 marr <- newArray lu init; return (IOUArray marr)
286 {-# INLINE newArray_ #-}
287 newArray_ lu = stToIO $ do
288 marr <- newArray_ lu; return (IOUArray marr)
289 {-# INLINE unsafeRead #-}
290 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
291 {-# INLINE unsafeWrite #-}
292 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
294 instance MArray IOUArray Word64 IO where
295 {-# INLINE newArray #-}
296 newArray lu init = stToIO $ do
297 marr <- newArray lu init; return (IOUArray marr)
298 {-# INLINE newArray_ #-}
299 newArray_ lu = stToIO $ do
300 marr <- newArray_ lu; return (IOUArray marr)
301 {-# INLINE unsafeRead #-}
302 unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
303 {-# INLINE unsafeWrite #-}
304 unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
306 #endif /* __GLASGOW_HASKELL__ */