-- SPDX-FileCopyrightText: Chris Pressey, the original author of this work, has dedicated it to the public domain.
-- For more information, please refer to <https://unlicense.org/>
-- SPDX-License-Identifier: Unlicense
import System.Random
import Debug.Trace
pickAt :: [a] -> Int -> (a, [a])
pickAt items@(x:xs) n
| n == 0 = (x, xs)
| n < 0 = error "range"
| otherwise =
let
(r, rs) = pickAt xs (n-1)
in
(r, x:rs)
randomIndex xs gen =
uniformR (0 :: Int, ((length xs) - 1) :: Int) gen
pickOne xs gen =
let
(index, gen') = randomIndex xs gen
(x, xs') = pickAt xs index
in
(x, xs', gen')
shuffle [] gen = ([], gen)
shuffle xs gen =
let
(x, xs', gen') = pickOne xs gen
(xs'', gen'') = shuffle xs' gen'
in
(x:xs'', gen'')
-- for demoing purposes
shuffleSeed items seed = fst $ shuffle items $ mkStdGen seed