idris-0.9.11: libs/neweffects/Effect/Random.idr
module Effect.Random
import Effects
data Random : Effect where
getRandom : { Integer } Random Integer
setSeed : Integer -> { Integer } Random ()
using (m : Type -> Type)
instance Handler Random m where
handle seed getRandom k
= let seed' = (1664525 * seed + 1013904223) `prim__sremBigInt` (pow 2 32) in
k seed' seed'
handle seed (setSeed n) k = k () n
RND : EFFECT
RND = MkEff Integer Random
rndInt : Integer -> Integer -> { [RND] } Eff m Integer
rndInt lower upper = do v <- getRandom
return (v `prim__sremBigInt` (upper - lower) + lower)
srand : Integer -> { [RND] } Eff m ()
srand n = setSeed n