module Language.Valid.Random (
randomSymbol, randomSymbolIO,
randomModule, randomModuleIO
) where
import Control.Monad
import Control.Monad.Random
import Data.Set (elemAt, size, Set)
import Language.Valid.Private
randomSetMember :: RandomGen g => Set a -> Rand g a
randomSetMember s = do
r <- getRandomR (0 :: Int, size s 1)
return $ elemAt r s
randomSymbolR :: RandomGen g => Rand g String
randomSymbolR = do
len <- getRandomR (1 :: Int, 8)
replicateM len (randomSetMember symbolChars)
randomModuleR :: RandomGen g => Rand g String
randomModuleR = do
len <- getRandomR (0 :: Int, 15)
s <- randomSetMember moduleStartChars
ns <- replicateM len (randomSetMember moduleChars)
return $ s:ns
randomSymbolIO :: IO String
randomSymbolIO = evalRandIO randomSymbolR
randomModuleIO :: IO String
randomModuleIO = evalRandIO randomModuleR
randomSymbol :: RandomGen g => g -> (String, g)
randomSymbol = runRand randomSymbolR
randomModule :: RandomGen g => g -> (String, g)
randomModule = runRand randomModuleR