module VectorShuffling.Mutable
where

import           VectorShuffling.Prelude hiding (swap, length)
import           Data.Vector.Mutable
import qualified System.Random           as A


shuffle :: MVector s a -> A.StdGen -> ST s A.StdGen
shuffle v gen =
  loop gen (length v)
  where
    loop gen i =
      if i <= 1
        then return gen
        else
          let
            (index, gen') = A.randomR (0, i') gen
            i' = i - 1
            in do
              swap v i' index
              loop gen' i'