Skip to content

Commit 29e364e

Browse files
committed
generic modify
1 parent d6bf887 commit 29e364e

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

Data/Vector/Generic/Mutable.hs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ module Data.Vector.Generic.Mutable (
4040
clear,
4141

4242
-- * 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,
4545

4646
-- * Modifying vectors
4747

@@ -687,6 +687,12 @@ write :: (PrimMonad m, MVector v a) => v (PrimState m) a -> Int -> a -> m ()
687687
write v i x = BOUNDS_CHECK(checkIndex) "write" i (length v)
688688
$ unsafeWrite v i x
689689

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+
690696
-- | Swap the elements at the given positions.
691697
swap :: (PrimMonad m, MVector v a) => v (PrimState m) a -> Int -> Int -> m ()
692698
{-# INLINE swap #-}
@@ -713,6 +719,13 @@ unsafeWrite :: (PrimMonad m, MVector v a)
713719
unsafeWrite v i x = UNSAFE_CHECK(checkIndex) "unsafeWrite" i (length v)
714720
$ basicUnsafeWrite v i x
715721

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+
716729
-- | Swap the elements at the given positions. No bounds checks are performed.
717730
unsafeSwap :: (PrimMonad m, MVector v a)
718731
=> v (PrimState m) a -> Int -> Int -> m ()

0 commit comments

Comments
 (0)