module Number.Generate
	( generateMax
	) where

import Number.Serialize
import Crypto.Random

{- a bit too simplitic and probably not very good. need to have a serious look
 - on how to generate random integer. -}
generateMax :: CryptoRandomGen g => g -> Integer -> Either GenError (Integer, g)
generateMax rng m =
	let nbbytes = nbBytes m in
	case genBytes nbbytes rng of
		Left err         -> Left err
		Right (bs, rng') ->
			let n = os2ip bs in
			if n < m then Right (n, rng') else generateMax rng' m

nbBytes :: Integer -> Int
nbBytes n
	| n < 256   = 1
	| otherwise = 1 + nbBytes (n `div` 256)