on d66da21 help sign in
25 lines 709 B history raw
1module Effect.Random
3import Effects
5data Random : Type -> Type -> Type -> Type where
6 getRandom : Random Integer Integer Integer
7 setSeed : Integer -> Random Integer Integer ()
9using (m : Type -> Type)
10 instance Handler Random m where
11 handle seed getRandom k
12 = let seed' = (1664525 * seed + 1013904223) `prim__sremBigInt` (pow 2 32) in
13 k seed' seed'
14 handle seed (setSeed n) k = k n ()
16RND : EFFECT
17RND = MkEff Integer Random
19rndInt : Integer -> Integer -> Eff m [RND] Integer
20rndInt lower upper = do v <- getRandom
21 return (v `prim__sremBigInt` (upper - lower) + lower)
23srand : Integer -> Eff m [RND] ()
24srand n = setSeed n