module ACME.Yes.PreCure5.Random
( choosePrecureFrom
, chooseTransformationPhraseFrom
, chooseMetamorphoseFrom
) where
import ACME.Yes.PreCure5.Class
import System.Random
import Control.Monad.State
import qualified Data.Set as S
choosePrecureFrom :: (PreCure p, RandomGen g) => S.Set p -> g -> (p, g)
choosePrecureFrom pset g = (ps !! i, g')
where
ps = S.toAscList pset
(i, g') = randomR (0, l) g
l = S.size pset 1
chooseTransformationPhraseFrom :: (PreCure p, RandomGen g) => S.Set p -> g -> (String, g)
chooseTransformationPhraseFrom pset g =
(flip runState) g $ do
i <- randomRSt (1, 5)
p <- state $ choosePrecureFrom pset
return $ transformationPhraseOf $ fiveOrSinglePreCure i p
chooseMetamorphoseFrom :: (PreCure p, RandomGen g) => S.Set p -> g -> (String, g)
chooseMetamorphoseFrom = chooseTransformationPhraseFrom
fiveOrSinglePreCure :: (PreCure p) => Int -> p -> S.Set p
fiveOrSinglePreCure 5 _ = allPrecures
fiveOrSinglePreCure _ p = S.singleton p
randomRSt :: (RandomGen g, Random a) => (a, a) -> State g a
randomRSt r = state $ randomR r