Added NFData instances for all vectors
authorBas van Dijk <v.dijk.bas@gmail.com>
Sat, 7 Jan 2012 16:09:49 +0000 (16:09 +0000)
committerBas van Dijk <v.dijk.bas@gmail.com>
Sat, 7 Jan 2012 16:09:49 +0000 (16:09 +0000)
Data/Vector.hs
Data/Vector/Mutable.hs
Data/Vector/Primitive.hs
Data/Vector/Primitive/Mutable.hs
Data/Vector/Storable.hs
Data/Vector/Storable/Mutable.hs
Data/Vector/Unboxed/Base.hs
vector.cabal

index 3b38d69..138b2db 100644 (file)
@@ -1,4 +1,9 @@
-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeFamilies, Rank2Types #-}
+{-# LANGUAGE FlexibleInstances
+           , MultiParamTypeClasses
+           , TypeFamilies
+           , Rank2Types
+           , BangPatterns
+  #-}
 
 -- |
 -- Module      : Data.Vector
@@ -156,6 +161,7 @@ import           Data.Vector.Mutable  ( MVector(..) )
 import           Data.Primitive.Array
 import qualified Data.Vector.Fusion.Stream as Stream
 
+import Control.DeepSeq ( NFData, rnf )
 import Control.Monad ( MonadPlus(..), liftM, ap )
 import Control.Monad.ST ( ST )
 import Control.Monad.Primitive
@@ -191,6 +197,12 @@ data Vector a = Vector {-# UNPACK #-} !Int
                        {-# UNPACK #-} !(Array a)
         deriving ( Typeable )
 
+instance NFData a => NFData (Vector a) where
+    rnf (Vector i n arr) = force i
+        where
+          force !ix | ix < n    = rnf (indexArray arr ix) `seq` force (ix+1)
+                    | otherwise = ()
+
 instance Show a => Show (Vector a) where
   showsPrec = G.showsPrec
 
index cc35edb..6168bea 100644 (file)
@@ -54,6 +54,8 @@ import qualified Data.Vector.Generic.Mutable as G
 import           Data.Primitive.Array
 import           Control.Monad.Primitive
 
+import Control.DeepSeq ( NFData, rnf )
+
 import Prelude hiding ( length, null, replicate, reverse, map, read,
                         take, drop, splitAt, init, tail )
 
@@ -70,6 +72,13 @@ data MVector s a = MVector {-# UNPACK #-} !Int
 type IOVector = MVector RealWorld
 type STVector s = MVector s
 
+instance NFData a => NFData (MVector s a) where
+    rnf (MVector i n arr) = unsafeInlineST $ force i
+        where
+          force !ix | ix < n    = do x <- readArray arr ix
+                                     rnf x `seq` force (ix+1)
+                    | otherwise = return ()
+
 instance G.MVector MVector a where
   {-# INLINE basicLength #-}
   basicLength (MVector _ n _) = n
index f6eb42b..5f59bae 100644 (file)
@@ -140,6 +140,8 @@ import qualified Data.Vector.Fusion.Stream as Stream
 import           Data.Primitive.ByteArray
 import           Data.Primitive ( Prim, sizeOf )
 
+import Control.DeepSeq ( NFData )
+
 import Control.Monad ( liftM )
 import Control.Monad.ST ( ST )
 import Control.Monad.Primitive
@@ -172,6 +174,8 @@ data Vector a = Vector {-# UNPACK #-} !Int
                        {-# UNPACK #-} !ByteArray
   deriving ( Typeable )
 
+instance NFData (Vector a)
+
 instance (Show a, Prim a) => Show (Vector a) where
   showsPrec = G.showsPrec
 
index d496e7e..2028ea5 100644 (file)
@@ -55,6 +55,8 @@ import           Data.Primitive ( Prim, sizeOf )
 import           Control.Monad.Primitive
 import           Control.Monad ( liftM )
 
+import Control.DeepSeq ( NFData )
+
 import Prelude hiding ( length, null, replicate, reverse, map, read,
                         take, drop, splitAt, init, tail )
 
@@ -71,6 +73,8 @@ data MVector s a = MVector {-# UNPACK #-} !Int
 type IOVector = MVector RealWorld
 type STVector s = MVector s
 
+instance NFData (MVector s a)
+
 instance Prim a => G.MVector MVector a where
   basicLength (MVector _ n _) = n
   basicUnsafeSlice j m (MVector i n arr)
index 5f88580..f9928e4 100644 (file)
@@ -146,6 +146,8 @@ import Foreign.ForeignPtr
 import Foreign.Ptr
 import Foreign.Marshal.Array ( advancePtr, copyArray )
 
+import Control.DeepSeq ( NFData )
+
 import Control.Monad.ST ( ST )
 import Control.Monad.Primitive
 
@@ -178,6 +180,8 @@ data Vector a = Vector {-# UNPACK #-} !Int
                        {-# UNPACK #-} !(ForeignPtr a)
         deriving ( Typeable )
 
+instance NFData (Vector a)
+
 instance (Show a, Storable a) => Show (Vector a) where
   showsPrec = G.showsPrec
 
index 2334b92..b61bc57 100644 (file)
@@ -57,6 +57,8 @@ module Data.Vector.Storable.Mutable(
   unsafeWith
 ) where
 
+import Control.DeepSeq ( NFData )
+
 import qualified Data.Vector.Generic.Mutable as G
 import Data.Vector.Storable.Internal
 
@@ -93,6 +95,8 @@ data MVector s a = MVector {-# UNPACK #-} !Int
 type IOVector = MVector RealWorld
 type STVector s = MVector s
 
+instance NFData (MVector s a)
+
 instance Storable a => G.MVector MVector a where
   {-# INLINE basicLength #-}
   basicLength (MVector n _) = n
index 2d9822e..00350cb 100644 (file)
@@ -22,6 +22,8 @@ import qualified Data.Vector.Generic.Mutable as M
 
 import qualified Data.Vector.Primitive as P
 
+import Control.DeepSeq ( NFData )
+
 import Control.Monad.Primitive
 import Control.Monad ( liftM )
 
@@ -50,6 +52,9 @@ type instance G.Mutable Vector = MVector
 
 class (G.Vector Vector a, M.MVector MVector a) => Unbox a
 
+instance NFData (Vector a)
+instance NFData (MVector s a)
+
 -- -----------------
 -- Data and Typeable
 -- -----------------
index 629682f..939e4a4 100644 (file)
@@ -171,7 +171,7 @@ Library
   Install-Includes:
         vector.h
 
-  Build-Depends: base >= 4 && < 5, primitive >= 0.4.9 && < 0.6, ghc-prim
+  Build-Depends: base >= 4 && < 5, primitive >= 0.4.0.1 && < 0.5, ghc-prim
 
   if impl(ghc<6.13)
     Ghc-Options: -finline-if-enough-args -fno-method-sharing