RandomDotOrg 0.1 → 0.2
raw patch · 3 files changed
+105/−39 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- RandomDotOrg: getRandomNumbers :: Int -> Int -> Int -> IO (Either String [Int])
+ System.Random.Atmosphere: getQuota :: IO (Either String Int)
+ System.Random.Atmosphere: getRandomNumbers :: Int -> Int -> Int -> IO (Either String [Int])
+ System.Random.Atmosphere: getRandomSequence :: Int -> Int -> IO (Either String [Int])
+ System.Random.Atmosphere: getRandomStrings :: Int -> Int -> Bool -> Bool -> Bool -> Bool -> IO (Either String [String])
Files
- RandomDotOrg.cabal +2/−2
- RandomDotOrg.hs +0/−37
- System/Random/Atmosphere.hs +103/−0
RandomDotOrg.cabal view
@@ -1,5 +1,5 @@ name: RandomDotOrg-version: 0.1+version: 0.2 build-type: Simple Cabal-Version: >= 1.2 synopsis: Interface to random numbers on random.org@@ -13,4 +13,4 @@ library build-depends: base, HTTP-Simple >= 0.1, network- exposed-modules: RandomDotOrg+ exposed-modules: System.Random.Atmosphere
− RandomDotOrg.hs
@@ -1,37 +0,0 @@-module RandomDotOrg (getRandomNumbers) where-import Data.Either-import Network.URI-import Network.HTTP.Simple--uri num min max - = concat [ "http://random.org/integers/?num="- , show num- , "&min="- , show min- , "&max="- , show max- , "&col=1&base=10&format=plain&rnd=new" ]---- | Used to get a list of random numbers from http://random.org.--- Note: the minimum must be greater than the maximum. The maximum--- amount of numbers you can retrieve is 10,000, and the numbers --- themselves are limited to a range of +/- 1,000,000,000 (inclusive)-getRandomNumbers :: Int -- ^ Number of integers to get- -> Int -- ^ Minimum number- -> Int -- ^ Maximum number- -> IO (Either String [Int]) -- ^ Returns either an error string or the list of integers-getRandomNumbers num min max- | max <= min = return $ Left "err: minimum must be greater than maximum"- | num > 10000 = return $ Left "err: can't retrieve more than 10,000 numbers"- | abs min > 1000000000 = return $ Left "err: min can't be more/less than 1,000,000,000"- | abs max > 1000000000 = return $ Left "err: max can't be more/less than 1,000,000,000"- | otherwise = do- let uri' = parseURI (uri num min max)- case uri' of- Nothing -> return $ Left "err: Network.URI.parseURI returned Nothing"- Just u -> getResult u- where getResult u = do- s <- httpGet u- case s of- Nothing -> return $ Left "err: Network.HTTP.Simple.httpGet returned Nothing"- Just s' -> return $ Right (map read (lines s'))
+ System/Random/Atmosphere.hs view
@@ -0,0 +1,103 @@+module System.Random.Atmosphere (+ getRandomNumbers -- :: Int -> Int -> Int -> IO (Either String [Int])+, getRandomSequence -- :: Int -> Int -> IO (Either String [Int])+, getRandomStrings -- :: Int -> Int -> Bool -> Bool -> Bool -> Bool -> IO (Either String [String])+, getQuota -- :: IO (Either String Int)+) where+import Data.Either+import Network.URI+import Network.HTTP.Simple++-- URI for integer generation+int_uri num min max + = concat [ "http://random.org/integers/?num=", show num+ , "&min=", show min+ , "&max=", show max+ , "&col=1&base=10&format=plain&rnd=new" ]++-- URI for sequence generation+seq_uri min max+ = concat [ "http://www.random.org/sequences/?min=", show min+ , "&max=", show max+ , "&format=plain&rnd=new" ]++-- URI for string generation+str_uri num len digits uppercase lowercase unique+ = concat [ "http://www.random.org/strings/?num=", show num+ , "&len=", show len+ , "&digits=", if digits == True then "on" else "off"+ , "&upperalpha=", if uppercase == True then "on" else "off"+ , "&loweralpha=", if lowercase == True then "on" else "off"+ , "&unique=", if unique == True then "on" else "off"+ , "&format=plain&rnd=new" ]++-- | Used to get a list of random numbers from http://random.org.+-- Note: the minimum must be greater than the maximum. The maximum+-- amount of numbers you can retrieve is 10,000, and the numbers +-- themselves are limited to a range of +/- 1,000,000,000 (inclusive)+getRandomNumbers :: Int -- ^ Number of integers to get+ -> Int -- ^ Minimum number+ -> Int -- ^ Maximum number+ -> IO (Either String [Int]) -- ^ Returns either an error string or the list of integers+getRandomNumbers num min max+ | max <= min = return $ Left "err: minimum must be greater than maximum"+ | num > 10000 = return $ Left "err: can't retrieve more than 10,000 numbers"+ | abs min > 1000000000 = return $ Left "err: min can't be more/less than 1,000,000,000"+ | abs max > 1000000000 = return $ Left "err: max can't be more/less than 1,000,000,000"+ | otherwise = do let uri' = parseURI (int_uri num min max)+ case uri' of+ Nothing -> return $ Left "err: parseURI returned Nothing"+ Just u -> retrieve u (map read . lines)++-- | This is just like 'getRandomNumbers', but instead it will+-- randomize a given interval of integers. The limits on the minimum/maximum+-- are -1e9 to 1e9, inclusive. The interval itself must be less than 10,000.+getRandomSequence :: Int -- ^ Minimum+ -> Int -- ^ Maximum+ -> IO (Either String [Int])+getRandomSequence min max+ | max <= min = return $ Left "err: max must be greater than min"+ | abs max > 1000000000 = return $ Left "err: max can't be greater/less than +/-1e9"+ | abs min > 1000000000 = return $ Left "err: min can't be greater/less than +/-1e9"+ | (max - min)+1 > 10000 = return $ Left "err: sequence must be smaller than 10,000"+ | otherwise = do let uri = parseURI (seq_uri min max)+ case uri of+ Nothing -> return $ Left "err: parseURI returned Nothing"+ Just u -> retrieve u (map read . lines)++-- | Generate random strings. NOTE: if you specify to generate unique+-- strings, the amount you want to retrieve /must/ be less than or equal to the+-- amount of strings that exist within the character set you specify.+-- In the future there will be a check for this, but you have to be sure as of+-- right now.+getRandomStrings :: Int -- ^ Number of strings requested, max is 10,000+ -> Int -- ^ Length of each string, max is 20+ -> Bool -- ^ Should digits be allowed?+ -> Bool -- ^ Should uppercase be allowed?+ -> Bool -- ^ Should lowercase be allowed?+ -> Bool -- ^ Should each string be unique?+ -> IO (Either String [String])+getRandomStrings num len digits uppercase lowercase unique+ | num > 10000 = return $ Left "err: maximum number of strings is 10,000"+ | len > 20 = return $ Left "err: maximum str len is 20"+ | otherwise = do let uri = parseURI (str_uri num len digits uppercase lowercase unique)+ case uri of+ Nothing -> return $ Left "err: parseURI returned Nothing"+ Just u' -> retrieve u' lines++-- | Used to check how much of your random.org quota you have. Please see+-- 'http://random.org/quota/' for more info.+getQuota :: IO (Either String Int)+getQuota = do let uri = parseURI "http://random.org/quota/?format=plain"+ case uri of+ Nothing -> return $ Left "err: parseURI returned Nothing"+ Just u -> retrieve u read+++-- helper utility that calls httpGet for us+-- it applies some function to the returned string so we can remove some+-- boilerplate+retrieve uri f = do s <- httpGet uri+ case s of+ Nothing -> return $ Left "err: httpGet returned nothing"+ Just s' -> return $ Right (f s')