module Autolib.Util.Perm where
import System.Random
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