summaryrefslogtreecommitdiff
path: root/lib/Data/Packed/ST.hs
diff options
context:
space:
mode:
authorAlberto Ruiz <aruiz@um.es>2012-01-07 04:28:58 -0800
committerAlberto Ruiz <aruiz@um.es>2012-01-07 04:28:58 -0800
commita6c307a0d9c3b48bf80d7012b893f2f9d1db9487 (patch)
treeca761c585a7a5287eae45a673f10f58931c8353a /lib/Data/Packed/ST.hs
parent2b009db14f1d3d4985f0274b71ed9ad86e9e2b7b (diff)
parentfdf8d8778d52cf14aec493ef5ab18d363b900ed7 (diff)
Merge pull request #6 from reinerp/unsafe-building-primitives
Unsafe building/reading primitives
Diffstat (limited to 'lib/Data/Packed/ST.hs')
-rw-r--r--lib/Data/Packed/ST.hs13
1 files changed, 5 insertions, 8 deletions
diff --git a/lib/Data/Packed/ST.hs b/lib/Data/Packed/ST.hs
index 22aff07..c96a209 100644
--- a/lib/Data/Packed/ST.hs
+++ b/lib/Data/Packed/ST.hs
@@ -98,7 +98,6 @@ readVector = safeIndexV unsafeReadVector
98writeVector :: Storable t => STVector s t -> Int -> t -> ST s () 98writeVector :: Storable t => STVector s t -> Int -> t -> ST s ()
99writeVector = safeIndexV unsafeWriteVector 99writeVector = safeIndexV unsafeWriteVector
100 100
101{-# NOINLINE newUndefinedVector #-}
102newUndefinedVector :: Storable t => Int -> ST s (STVector s t) 101newUndefinedVector :: Storable t => Int -> ST s (STVector s t)
103newUndefinedVector = unsafeIOToST . fmap STVector . createVector 102newUndefinedVector = unsafeIOToST . fmap STVector . createVector
104 103
@@ -114,13 +113,13 @@ newVector x n = do
114 113
115{-# INLINE ioReadM #-} 114{-# INLINE ioReadM #-}
116ioReadM :: Storable t => Matrix t -> Int -> Int -> IO t 115ioReadM :: Storable t => Matrix t -> Int -> Int -> IO t
117ioReadM (MC _ nc cv) r c = ioReadV cv (r*nc+c) 116ioReadM (Matrix _ nc cv RowMajor) r c = ioReadV cv (r*nc+c)
118ioReadM (MF nr _ fv) r c = ioReadV fv (c*nr+r) 117ioReadM (Matrix nr _ fv ColumnMajor) r c = ioReadV fv (c*nr+r)
119 118
120{-# INLINE ioWriteM #-} 119{-# INLINE ioWriteM #-}
121ioWriteM :: Storable t => Matrix t -> Int -> Int -> t -> IO () 120ioWriteM :: Storable t => Matrix t -> Int -> Int -> t -> IO ()
122ioWriteM (MC _ nc cv) r c val = ioWriteV cv (r*nc+c) val 121ioWriteM (Matrix _ nc cv RowMajor) r c val = ioWriteV cv (r*nc+c) val
123ioWriteM (MF nr _ fv) r c val = ioWriteV fv (c*nr+r) val 122ioWriteM (Matrix nr _ fv ColumnMajor) r c val = ioWriteV fv (c*nr+r) val
124 123
125newtype STMatrix s t = STMatrix (Matrix t) 124newtype STMatrix s t = STMatrix (Matrix t)
126 125
@@ -154,8 +153,7 @@ unsafeFreezeMatrix (STMatrix x) = unsafeIOToST . return $ x
154freezeMatrix :: (Storable t) => STMatrix s1 t -> ST s2 (Matrix t) 153freezeMatrix :: (Storable t) => STMatrix s1 t -> ST s2 (Matrix t)
155freezeMatrix m = liftSTMatrix id m 154freezeMatrix m = liftSTMatrix id m
156 155
157cloneMatrix (MC r c d) = cloneVector d >>= return . MC r c 156cloneMatrix (Matrix r c d o) = cloneVector d >>= return . (\d' -> Matrix r c d' o)
158cloneMatrix (MF r c d) = cloneVector d >>= return . MF r c
159 157
160{-# INLINE safeIndexM #-} 158{-# INLINE safeIndexM #-}
161safeIndexM f (STMatrix m) r c 159safeIndexM f (STMatrix m) r c
@@ -172,7 +170,6 @@ readMatrix = safeIndexM unsafeReadMatrix
172writeMatrix :: Storable t => STMatrix s t -> Int -> Int -> t -> ST s () 170writeMatrix :: Storable t => STMatrix s t -> Int -> Int -> t -> ST s ()
173writeMatrix = safeIndexM unsafeWriteMatrix 171writeMatrix = safeIndexM unsafeWriteMatrix
174 172
175{-# NOINLINE newUndefinedMatrix #-}
176newUndefinedMatrix :: Storable t => MatrixOrder -> Int -> Int -> ST s (STMatrix s t) 173newUndefinedMatrix :: Storable t => MatrixOrder -> Int -> Int -> ST s (STMatrix s t)
177newUndefinedMatrix order r c = unsafeIOToST $ fmap STMatrix $ createMatrix order r c 174newUndefinedMatrix order r c = unsafeIOToST $ fmap STMatrix $ createMatrix order r c
178 175