diff options
Diffstat (limited to 'lib/Data/Packed/Internal/Vector.hs')
-rw-r--r-- | lib/Data/Packed/Internal/Vector.hs | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/lib/Data/Packed/Internal/Vector.hs b/lib/Data/Packed/Internal/Vector.hs index f2646a4..0d9dc70 100644 --- a/lib/Data/Packed/Internal/Vector.hs +++ b/lib/Data/Packed/Internal/Vector.hs | |||
@@ -21,6 +21,28 @@ import Complex | |||
21 | import Control.Monad(when) | 21 | import Control.Monad(when) |
22 | import Data.List(transpose) | 22 | import Data.List(transpose) |
23 | import Debug.Trace(trace) | 23 | import Debug.Trace(trace) |
24 | import Foreign.C.String(peekCString) | ||
25 | import Foreign.C.Types | ||
26 | |||
27 | |||
28 | data Vector t = V { dim :: Int | ||
29 | , fptr :: ForeignPtr t | ||
30 | , ptr :: Ptr t | ||
31 | } | ||
32 | |||
33 | check :: String -> [Vector a] -> IO Int -> IO () | ||
34 | check msg ls f = do | ||
35 | err <- f | ||
36 | when (err/=0) $ if err > 999 -- FIXME, it should be 1024 | ||
37 | then (error (msg++": "++errorCode err)) | ||
38 | else do | ||
39 | ps <- gsl_strerror err | ||
40 | s <- peekCString ps | ||
41 | error (msg++": "++s) | ||
42 | mapM_ (touchForeignPtr . fptr) ls | ||
43 | return () | ||
44 | |||
45 | foreign import ccall "aux.h gsl_strerror" gsl_strerror :: Int -> IO (Ptr CChar) | ||
24 | 46 | ||
25 | type Vc t s = Int -> Ptr t -> s | 47 | type Vc t s = Int -> Ptr t -> s |
26 | -- not yet admitted by my haddock version | 48 | -- not yet admitted by my haddock version |
@@ -30,8 +52,6 @@ type Vc t s = Int -> Ptr t -> s | |||
30 | vec :: Vector t -> (Vc t s) -> s | 52 | vec :: Vector t -> (Vc t s) -> s |
31 | vec v f = f (dim v) (ptr v) | 53 | vec v f = f (dim v) (ptr v) |
32 | 54 | ||
33 | --baseOf v = (v `at` 0) | ||
34 | |||
35 | createVector :: Storable a => Int -> IO (Vector a) | 55 | createVector :: Storable a => Int -> IO (Vector a) |
36 | createVector n = do | 56 | createVector n = do |
37 | when (n <= 0) $ error ("trying to createVector of dim "++show n) | 57 | when (n <= 0) $ error ("trying to createVector of dim "++show n) |
@@ -86,8 +106,6 @@ infixl 9 @> | |||
86 | (@>) = at | 106 | (@>) = at |
87 | 107 | ||
88 | 108 | ||
89 | |||
90 | |||
91 | -- | creates a new Vector by joining a list of Vectors | 109 | -- | creates a new Vector by joining a list of Vectors |
92 | join :: Storable t => [Vector t] -> Vector t | 110 | join :: Storable t => [Vector t] -> Vector t |
93 | join [] = error "joining zero vectors" | 111 | join [] = error "joining zero vectors" |
@@ -111,7 +129,6 @@ asReal v = V { dim = 2*dim v, fptr = castForeignPtr (fptr v), ptr = castPtr (pt | |||
111 | asComplex :: Vector Double -> Vector (Complex Double) | 129 | asComplex :: Vector Double -> Vector (Complex Double) |
112 | asComplex v = V { dim = dim v `div` 2, fptr = castForeignPtr (fptr v), ptr = castPtr (ptr v) } | 130 | asComplex v = V { dim = dim v `div` 2, fptr = castForeignPtr (fptr v), ptr = castPtr (ptr v) } |
113 | 131 | ||
114 | |||
115 | ---------------------------------------------------------------- | 132 | ---------------------------------------------------------------- |
116 | 133 | ||
117 | liftVector :: (Storable a, Storable b) => (a-> b) -> Vector a -> Vector b | 134 | liftVector :: (Storable a, Storable b) => (a-> b) -> Vector a -> Vector b |