Add D.V.Unboxed.Mutable.IO
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 4 Sep 2009 09:30:57 +0000 (09:30 +0000)
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>
Fri, 4 Sep 2009 09:30:57 +0000 (09:30 +0000)
Data/Vector/Mutable/IO.hs
Data/Vector/Unboxed/Mutable/IO.hs [new file with mode: 0644]
vector.cabal

index 371d2f9..dcc6e8a 100644 (file)
@@ -2,7 +2,7 @@
 
 -- |
 -- Module      : Data.Vector.Mutable.IO
--- Copyright   : (c) Roman Leshchinskiy 2008
+-- Copyright   : (c) Roman Leshchinskiy 2009
 -- License     : BSD-style
 --
 -- Maintainer  : Roman Leshchinskiy <rl@cse.unsw.edu.au>
diff --git a/Data/Vector/Unboxed/Mutable/IO.hs b/Data/Vector/Unboxed/Mutable/IO.hs
new file mode 100644 (file)
index 0000000..18034ee
--- /dev/null
@@ -0,0 +1,59 @@
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
+
+-- |
+-- Module      : Data.Vector.Mutable.Unboxed.IO
+-- Copyright   : (c) Roman Leshchinskiy 2009
+-- License     : BSD-style
+--
+-- Maintainer  : Roman Leshchinskiy <rl@cse.unsw.edu.au>
+-- Stability   : experimental
+-- Portability : non-portable
+-- 
+-- Mutable unboxed vectors in the IO monad.
+--
+
+module Data.Vector.Unboxed.Mutable.IO ( Vector(..) )
+where
+
+import           Data.Vector.MVector ( MVector(..), MVectorPure(..) )
+import qualified Data.Vector.Unboxed.Mutable.ST as STV
+import           Data.Vector.Unboxed.Unbox ( Unbox )
+
+import GHC.Base   ( RealWorld )
+import GHC.ST     ( ST(..) )
+import GHC.IOBase ( IO(..) )
+
+import Prelude hiding ( length )
+
+-- | IO-based mutable vectors
+newtype Vector a = Vector (STV.Vector RealWorld a)
+
+instance Unbox a => MVectorPure Vector a where
+  {-# INLINE length #-}
+  length (Vector v) = length v
+
+  {-# INLINE unsafeSlice #-}
+  unsafeSlice (Vector v) j m = Vector (unsafeSlice v j m)
+
+  {-# INLINE overlaps #-}
+  overlaps (Vector v1) (Vector v2) = overlaps v1 v2
+
+instance Unbox a => MVector Vector IO a where
+  {-# INLINE unsafeNew #-}
+  unsafeNew n = Vector `fmap` stToIO (unsafeNew n)
+
+  {-# INLINE unsafeNewWith #-}
+  unsafeNewWith n x = Vector `fmap` stToIO (unsafeNewWith n x)
+
+  {-# INLINE unsafeRead #-}
+  unsafeRead (Vector v) i = stToIO (unsafeRead v i)
+
+  {-# INLINE unsafeWrite #-}
+  unsafeWrite (Vector v) i x = stToIO (unsafeWrite v i x)
+
+  {-# INLINE clear #-}
+  clear (Vector v) = stToIO (clear v)
+
+stToIO :: ST RealWorld a -> IO a
+stToIO (ST m) = IO m
+
index 3bbbbf7..69f103f 100644 (file)
@@ -36,6 +36,7 @@ Library
 
         Data.Vector.Unboxed.Unbox
         Data.Vector.Unboxed.Mutable.ST
+        Data.Vector.Unboxed.Mutable.IO
         Data.Vector.Unboxed
 
         Data.Vector.Mutable.ST