module Crypto.RNG.Utils where
import Control.Monad
import Data.Primitive.SmallArray
import Crypto.RNG
randomString :: CryptoRNG m => Int -> [Char] -> m String
randomString :: Int -> [Char] -> m [Char]
randomString Int
n [Char]
allowedList = (Int -> Char) -> [Int] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
map (SmallArray Char -> Int -> Char
forall a. SmallArray a -> Int -> a
indexSmallArray SmallArray Char
allowed)
([Int] -> [Char]) -> m [Int] -> m [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> m Int -> m [Int]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n ((Int, Int) -> m Int
forall (m :: * -> *) a.
(CryptoRNG m, UniformRange a) =>
(a, a) -> m a
randomR (Int
0, SmallArray Char -> Int
forall a. SmallArray a -> Int
sizeofSmallArray SmallArray Char
allowed Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
where
allowed :: SmallArray Char
allowed = [Char] -> SmallArray Char
forall a. [a] -> SmallArray a
smallArrayFromList [Char]
allowedList