git @ Cat's Eye Technologies Dipple / master haskell / shuffle.hs
master

Tree @master (Download .tar.gz)

shuffle.hs @masterraw · history · blame

-- 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