package fj; /** * Created by MarkPerry on 7/07/2014. */ public abstract class Rng { public abstract P2<Rng, Integer> nextInt(); public abstract P2<Rng, Long> nextLong(); // [low, high] inclusive public final P2<Rng, Integer> range(int low, int high) { return nextNatural().map2(x -> (x % (high - low + 1)) + low); } public final P2<Rng, Integer> nextNatural() { return nextInt().map2(x -> x < 0 ? -(x + 1) : x); } }