module VectorExtras.Generic.Mutable where

import Data.Vector.Generic.Mutable hiding (forM_)
import VectorExtras.Prelude

{-# INLINE writeListInReverseOrderStartingFrom #-}
writeListInReverseOrderStartingFrom :: (MVector v a) => v s a -> Int -> [a] -> ST s ()
writeListInReverseOrderStartingFrom :: forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> Int -> [a] -> ST s ()
writeListInReverseOrderStartingFrom v s a
v =
  let loop :: Int -> [a] -> ST s ()
loop !Int
index = \case
        a
value : [a]
tail -> do
          forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
unsafeWrite v s a
v Int
index a
value
          Int -> [a] -> ST s ()
loop (forall a. Enum a => a -> a
pred Int
index) [a]
tail
        [a]
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
   in Int -> [a] -> ST s ()
loop

{-# INLINE writeAssocList #-}
writeAssocList :: (MVector v a) => v s a -> [(Int, a)] -> ST s ()
writeAssocList :: forall (v :: * -> * -> *) a s.
MVector v a =>
v s a -> [(Int, a)] -> ST s ()
writeAssocList v s a
v =
  forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ forall a b. (a -> b) -> a -> b
$ \(Int
i, a
value) -> forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
unsafeWrite v s a
v Int
i a
value