    {-# LANGUAGE BangPatterns #-}
    module Control.Foldl.Util.MVector
    where

    import Data.Vector.Generic.Mutable
    import Control.Monad.ST

    {-# 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] -> m ()
    loop !Int
    index [a]
    list = case [a]
    list of
        a
    h : [a]
    t -> do
          v (PrimState m) a -> Int -> a -> m ()
    forall (m :: * -> *) (v :: * -> * -> *) a.
    (PrimMonad m, MVector v a) =>
    v (PrimState m) a -> Int -> a -> m ()
    unsafeWrite v s a
    v (PrimState m) a
    v Int
    index a
    h
          Int -> [a] -> m ()
    loop (Int -> Int
    forall a. Enum a => a -> a
    pred Int
    index) [a]
    t
        [a]
    _ -> () -> m ()
    forall a. a -> m a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      in Int -> [a] -> ST s ()
    forall {m :: * -> *}.
    (PrimState m ~ s, PrimMonad m) =>
    Int -> [a] -> m ()
    loop