random-string-0.1.0.1: src/System/RandomString.hs
module System.RandomString where
import Data.String (IsString(..))
import qualified Data.ByteString.Char8 as B8
import qualified Data.ByteString.Base58 as Base58
import qualified Data.ByteString.Base64 as Base64
import qualified Data.ByteString.Base16 as Base16
import Control.Monad.IO.Class
import System.Entropy
data StringOpts = StringOpts { alphabet :: Alphabet, nrBytes :: Int }
data Alphabet = Base58 | Base16 | Base64
randomString :: (MonadIO m, IsString s) => StringOpts -> m s
randomString opts =
let getE n = maybe (getEntropy n) pure =<< getHardwareEntropy n
conv = fromString . B8.unpack
enc = case alphabet opts of
Base58 -> Base58.encodeBase58 Base58.bitcoinAlphabet
Base16 -> Base16.encode
Base64 -> Base64.encode
in (conv . enc) <$> liftIO (getE (nrBytes opts))