module OpenTheory.Natural.Uniform
where
import qualified OpenTheory.Natural.Bits as Bits
import qualified OpenTheory.Primitive.Natural as Natural
import qualified OpenTheory.Primitive.Random as Primitive.Random
import qualified OpenTheory.Random as Random
random :: Natural.Natural -> Primitive.Random.Random -> Natural.Natural
random n =
\r -> let w = Bits.width (n 1) in loop w r
where
loop w r =
let (r1, r2) = Primitive.Random.split r in
let l = Random.bits w r1 in
let m = Bits.fromList l in
if m < n then m else loop w r2