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

diff --git a/Data/Vector/Mutable/IO.hs b/Data/Vector/Mutable/IO.hs
new file mode 100644 (file)
index 0000000..371d2f9
--- /dev/null
@@ -0,0 +1,58 @@
+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
+
+-- |
+-- Module      : Data.Vector.Mutable.IO
+-- Copyright   : (c) Roman Leshchinskiy 2008
+-- License     : BSD-style
+--
+-- Maintainer  : Roman Leshchinskiy <rl@cse.unsw.edu.au>
+-- Stability   : experimental
+-- Portability : non-portable
+-- 
+-- Mutable boxed vectors in the IO monad.
+--
+
+module Data.Vector.Mutable.IO ( Vector(..) )
+where
+
+import           Data.Vector.MVector ( MVector(..), MVectorPure(..) )
+import qualified Data.Vector.Mutable.ST as STV
+
+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 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 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 4f872d8..a4348d4 100644 (file)
@@ -39,6 +39,7 @@ Library
         Data.Vector.Unboxed
 
         Data.Vector.Mutable.ST
+        Data.Vector.Mutable.IO
         Data.Vector
   Include-Dirs:
         include