module Crypto.RNG.Utils where

import Control.Monad
import Data.Primitive.SmallArray

import Crypto.RNG

-- | Generate random string of specified length that contains allowed
-- chars.
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