package readerwriter import readerwriter.internal.State, State._ import util._ object Randoms { def threeInts: State[RNG, (Int, Int, Int)] = ??? /*@formatter:off*/ def randomInt: State[RNG, Int] = for { rng <- get[RNG] (rng2, i) = rng.nextInt _ <- set(rng2) } yield i /*@formatter:on*/ def nonNegativeInt: State[RNG, Int] = for { i <- randomInt } yield if (i < 0) -(i + 1) else i } trait RNG { def nextInt: (RNG, Int) } case class Simple(seed: Long) extends RNG { def nextInt: (RNG, Int) = { val newSeed = (seed * 0x5DEECE66DL + 0xBL) & 0xFFFFFFFFFFFFL val nextRNG = Simple(newSeed) val n = (newSeed >>> 16).toInt (nextRNG, n) } }