quantum-random-0.6.0: src-lib/Quantum/Random/ANU.hs
-- | This module provides functionality for retrieving and parsing the
-- quantum random number data from the Australian National University QRN server.
--
-- This module can be used when one only wants to use live data directly from the server,
-- without using any of the data store functionality.
--
-- In most other cases it should be imported via the "Quantum.Random" module.
module Quantum.Random.ANU (
-- ** QRN data retrieval
fetchQR,
fetchQRBits,
) where
import Quantum.Random.Codec
import Quantum.Random.Exceptions
import Data.Word (Word8)
import Data.Bits (testBit)
import Data.ByteString.Lazy (ByteString)
import Network.HTTP.Conduit (simpleHttp)
anuURL :: Int -> String
anuURL n = "https://qrng.anu.edu.au/API/jsonI.php?length=" ++ show n ++ "&type=uint8"
getANU :: Int -> IO ByteString
getANU = simpleHttp . anuURL
fetchQRResponse :: Int -> IO QRResponse
fetchQRResponse n = throwLeft $ parseResponse <$> getANU n
-- | Fetch quantum random data from ANU server as a linked list of bytes via HTTPS. Network
-- problems may result in an `HttpException`. An invalid response triggers a 'QRException'.
fetchQR :: Int -> IO [Word8]
fetchQR n = map fromIntegral . qdata <$> fetchQRResponse n
-- | Fetch QRN data from ANU server as a linked list of booleans via HTTPS. Network
-- problems may result in an `HttpException`. An invalid response triggers a 'QRException'.
fetchQRBits :: Int -> IO [Bool]
fetchQRBits n = concat . map w8bools <$> fetchQR n
-- Converts a byte (Word8) to the corresponding list of 8 boolean values.
-- 'Bits' type class indexes bits from least to most significant, thus the reverse
w8bools :: Word8 -> [Bool]
w8bools w = reverse $ testBit w <$> [0..7]