@@ -40,8 +40,8 @@ module Data.Vector.Generic.Mutable (
40
40
clear ,
41
41
42
42
-- * Accessing individual elements
43
- read , write , swap , exchange ,
44
- unsafeRead , unsafeWrite , unsafeSwap , unsafeExchange ,
43
+ read , write , modify , swap , exchange ,
44
+ unsafeRead , unsafeWrite , unsafeModify , unsafeSwap , unsafeExchange ,
45
45
46
46
-- * Modifying vectors
47
47
@@ -687,6 +687,12 @@ write :: (PrimMonad m, MVector v a) => v (PrimState m) a -> Int -> a -> m ()
687
687
write v i x = BOUNDS_CHECK (checkIndex) " write" i (length v)
688
688
$ unsafeWrite v i x
689
689
690
+ -- | Modify the element at the given position.
691
+ modify :: (PrimMonad m , MVector v a ) => v (PrimState m ) a -> (a -> a ) -> Int -> m ()
692
+ {-# INLINE modify #-}
693
+ modify v f i = BOUNDS_CHECK (checkIndex) " modify" i (length v)
694
+ $ unsafeModify v f i
695
+
690
696
-- | Swap the elements at the given positions.
691
697
swap :: (PrimMonad m , MVector v a ) => v (PrimState m ) a -> Int -> Int -> m ()
692
698
{-# INLINE swap #-}
@@ -713,6 +719,13 @@ unsafeWrite :: (PrimMonad m, MVector v a)
713
719
unsafeWrite v i x = UNSAFE_CHECK (checkIndex) " unsafeWrite" i (length v)
714
720
$ basicUnsafeWrite v i x
715
721
722
+ -- | Modify the element at the given position. No bounds checks are performed.
723
+ unsafeModify :: (PrimMonad m , MVector v a ) => v (PrimState m ) a -> (a -> a ) -> Int -> m ()
724
+ {-# INLINE unsafeModify #-}
725
+ unsafeModify v f i = UNSAFE_CHECK (checkIndex) " unsafeModify" i (length v)
726
+ $ basicUnsafeRead v i >>= \ x ->
727
+ basicUnsafeWrite v i (f x)
728
+
716
729
-- | Swap the elements at the given positions. No bounds checks are performed.
717
730
unsafeSwap :: (PrimMonad m , MVector v a )
718
731
=> v (PrimState m ) a -> Int -> Int -> m ()
0 commit comments