module Autolib.Util.Perm where

import System.Random

-- | eine zufällige Permutation
permIO :: [a] -> IO [a]
permIO :: forall a. [a] -> IO [a]
permIO [   ] = [a] -> IO [a]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [   ]
permIO [ a
x ] = [a] -> IO [a]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [ a
x ]
permIO ( a
x : [a]
xs ) = do
    k <- (Int, Int) -> IO Int
forall a (m :: * -> *). (Random a, MonadIO m) => (a, a) -> m a
randomRIO ( Int
0, [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs )
    ys <- permIO xs
    let ( pre, post ) = splitAt k ys
    return $ pre ++ x : post