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 :: 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
          v (PrimState (ST s)) a -> Int -> a -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
unsafeWrite v s a
v (PrimState (ST s)) a
v Int
index a
value
          Int -> [a] -> ST s ()
loop (Int -> Int
forall a. Enum a => a -> a
pred Int
index) [a]
tail
        [a]
_ -> () -> ST s ()
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 :: v s a -> [(Int, a)] -> ST s ()
writeAssocList v s a
v =
  ((Int, a) -> ST s ()) -> [(Int, a)] -> ST s ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ (((Int, a) -> ST s ()) -> [(Int, a)] -> ST s ())
-> ((Int, a) -> ST s ()) -> [(Int, a)] -> ST s ()
forall a b. (a -> b) -> a -> b
$ \(Int
i, a
value) -> v (PrimState (ST s)) a -> Int -> a -> ST s ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> Int -> a -> m ()
unsafeWrite v s a
v (PrimState (ST s)) a
v Int
i a
value