    -- |
    -- Module      : Crypto.Random.Entropy
    -- License     : BSD-style
    -- Maintainer  : Vincent Hanquez <vincent@snarc.org>
    -- Stability   : experimental
    -- Portability : Good
    --
    module Crypto.Random.Entropy
        ( getEntropy
        ) where

    import           Data.Maybe (catMaybes)
    import           Crypto.Internal.ByteArray (ByteArray)
    import qualified Crypto.Internal.ByteArray as B

    import           Crypto.Random.Entropy.Unsafe

    -- | Get some entropy from the system source of entropy
    getEntropy :: ByteArray byteArray => Int -> IO byteArray
    getEntropy :: Int -> IO byteArray
    getEntropy n :: Int
    n = do
        [EntropyBackend]
    backends <- [Maybe EntropyBackend] -> [EntropyBackend]
    forall a. [Maybe a] -> [a]
    catMaybes ([Maybe EntropyBackend] -> [EntropyBackend])
    -> IO [Maybe EntropyBackend] -> IO [EntropyBackend]
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    `fmap` [IO (Maybe EntropyBackend)] -> IO [Maybe EntropyBackend]
    forall (t :: * -> *) (m :: * -> *) a.
    (Traversable t, Monad m) =>
    t (m a) -> m (t a)
    sequence [IO (Maybe EntropyBackend)]
    supportedBackends
        Int -> (Ptr Word8 -> IO ()) -> IO byteArray
    forall ba p. ByteArray ba => Int -> (Ptr p -> IO ()) -> IO ba
    B.alloc Int
    n (Int -> [EntropyBackend] -> Ptr Word8 -> IO ()
    replenish Int
    n [EntropyBackend]
    backends)