diff options
author | Alberto Ruiz <aruiz@um.es> | 2011-07-10 17:31:24 +0000 |
---|---|---|
committer | Alberto Ruiz <aruiz@um.es> | 2011-07-10 17:31:24 +0000 |
commit | 2cb2293eeb617baa404f444944bb4613c645133a (patch) | |
tree | 8506bf7fe33d640bdb859b80bae5bc30d254f5d6 /lib | |
parent | b48c876b4b9ba37e45104fc7b54d8024c6bd1eb5 (diff) |
pure mapVectorWithIndex
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Data/Packed/Internal/Vector.hs | 17 | ||||
-rw-r--r-- | lib/Data/Packed/Vector.hs | 2 |
2 files changed, 17 insertions, 2 deletions
diff --git a/lib/Data/Packed/Internal/Vector.hs b/lib/Data/Packed/Internal/Vector.hs index 078cb36..8f403f4 100644 --- a/lib/Data/Packed/Internal/Vector.hs +++ b/lib/Data/Packed/Internal/Vector.hs | |||
@@ -17,7 +17,7 @@ module Data.Packed.Internal.Vector ( | |||
17 | Vector, dim, | 17 | Vector, dim, |
18 | fromList, toList, (|>), | 18 | fromList, toList, (|>), |
19 | join, (@>), safe, at, at', subVector, takesV, | 19 | join, (@>), safe, at, at', subVector, takesV, |
20 | mapVector, zipVectorWith, unzipVectorWith, | 20 | mapVector, mapVectorWithIndex, zipVectorWith, unzipVectorWith, |
21 | mapVectorM, mapVectorM_, mapVectorWithIndexM, mapVectorWithIndexM_, | 21 | mapVectorM, mapVectorM_, mapVectorWithIndexM, mapVectorWithIndexM_, |
22 | foldVector, foldVectorG, foldLoop, foldVectorWithIndex, | 22 | foldVector, foldVectorG, foldLoop, foldVectorWithIndex, |
23 | createVector, vec, | 23 | createVector, vec, |
@@ -497,6 +497,21 @@ mapVectorWithIndexM_ f v = do | |||
497 | mapVectorM' (k+1) t | 497 | mapVectorM' (k+1) t |
498 | {-# INLINE mapVectorWithIndexM_ #-} | 498 | {-# INLINE mapVectorWithIndexM_ #-} |
499 | 499 | ||
500 | |||
501 | mapVectorWithIndex :: (Storable a, Storable b) => (Int -> a -> b) -> Vector a -> Vector b | ||
502 | --mapVectorWithIndex g = head . mapVectorWithIndexM (\a b -> [g a b]) | ||
503 | mapVectorWithIndex f v = unsafePerformIO $ do | ||
504 | w <- createVector (dim v) | ||
505 | unsafeWith v $ \p -> | ||
506 | unsafeWith w $ \q -> do | ||
507 | let go (-1) = return () | ||
508 | go !k = do x <- peekElemOff p k | ||
509 | pokeElemOff q k (f k x) | ||
510 | go (k-1) | ||
511 | go (dim v -1) | ||
512 | return w | ||
513 | {-# INLINE mapVectorWithIndex #-} | ||
514 | |||
500 | ------------------------------------------------------------------- | 515 | ------------------------------------------------------------------- |
501 | 516 | ||
502 | 517 | ||
diff --git a/lib/Data/Packed/Vector.hs b/lib/Data/Packed/Vector.hs index f90f8e4..dad5d28 100644 --- a/lib/Data/Packed/Vector.hs +++ b/lib/Data/Packed/Vector.hs | |||
@@ -20,7 +20,7 @@ module Data.Packed.Vector ( | |||
20 | fromList, (|>), toList, buildVector, | 20 | fromList, (|>), toList, buildVector, |
21 | dim, (@>), | 21 | dim, (@>), |
22 | subVector, takesV, join, | 22 | subVector, takesV, join, |
23 | mapVector, zipVector, zipVectorWith, unzipVector, unzipVectorWith, | 23 | mapVector, mapVectorWithIndex, zipVector, zipVectorWith, unzipVector, unzipVectorWith, |
24 | mapVectorM, mapVectorM_, mapVectorWithIndexM, mapVectorWithIndexM_, | 24 | mapVectorM, mapVectorM_, mapVectorWithIndexM, mapVectorWithIndexM_, |
25 | foldLoop, foldVector, foldVectorG, foldVectorWithIndex | 25 | foldLoop, foldVector, foldVectorG, foldVectorWithIndex |
26 | ) where | 26 | ) where |