module BLAS.Tensor.Mutable (
MTensor(..),
writeElem,
modifyElem,
) where
import BLAS.Tensor.Base
import BLAS.Tensor.ReadOnly
class (RTensor x i e m) => (MTensor x i e m) where
getMaxSize :: x e -> m Int
getMaxSize = getSize
setZero :: x e -> m ()
setConstant :: e -> x e -> m ()
canModifyElem :: x e -> i -> m Bool
unsafeWriteElem :: x e -> i -> e -> m ()
unsafeModifyElem :: x e -> i -> (e -> e) -> m ()
unsafeModifyElem x i f = do
e <- unsafeReadElem x i
unsafeWriteElem x i (f e)
modifyWith :: (e -> e) -> x e -> m ()
writeElem :: (MTensor x i e m, Show i) => x e -> i -> e -> m ()
writeElem x i e = do
ok <- canModifyElem x i
case ok of
False ->
fail $ "tried to set element at index `" ++ show i ++ "'"
++ " in an object with shape `" ++ show s ++ "'"
++ " but that element cannot be modified"
True ->
unsafeWriteElem x i e
where
s = shape x
modifyElem :: (MTensor x i e m, Show i) => x e -> i -> (e -> e) -> m ()
modifyElem x i f = do
ok <- canModifyElem x i
case ok of
False ->
fail $ "tried to modify element at index `" ++ show i ++ "'"
++ " in an object with shape `" ++ show s ++ "'"
++ " but that element cannot be modified"
True ->
unsafeModifyElem x i f
where
s = shape x