HoistRandom <TRng, TValue>( RandomCxt <TRng> _cxt, Maybe <TValue> value) { var m = new MaybeT <Random <TRng, TValue>, Random <TRng, Maybe <TValue> >, Maybe <TValue>, TValue>(); return((MaybeT <Random <TRng, TValue>, Random <TRng, Maybe <TValue> >, Maybe <TValue>, TValue>)m.Hoist(value)); }
public static async Task LinqRandomTest() { var cxt = new RandomCxt <Random>(); var init = 5; var computation = from x in MaybeT.Lift(cxt.RandomInt()) from y in MaybeT.Lift(cxt.RandomInt(20, 30)) from z in MaybeT.Lift(cxt.RandomInts(30, 100, 40)) from u in MaybeT.Lift(cxt.Random32Bits()) from v in MaybeT.Lift(cxt.Random64Bits()) let bs = new byte[16] from w in MaybeT.Lift(cxt.RandomBytes(bs)) from t in MaybeT.Lift(cxt.RandomDouble()) from s in MaybeT.Lift(cxt.RandomDouble(4.5, 8.9)) from r in MaybeT.Lift(cxt.RandomDoubles(4.5, 8.9, 20)) from q in MaybeT.Lift(cxt.RandomGaussianDouble(50, 2)) from p in MaybeT.Lift(cxt.RandomGaussianDoubles(50, 2, 1000)) from _ in MaybeT.HoistRandom(cxt, Maybe.JustIf(init >= 3, () => new Unit())) from o in MaybeT.Lift(cxt.RandomInt()) select new { x, y, z, u, v, w, t, s, r, q, p, o }; var value = await computation.Run.RunRandom().Run(); Assert.True(value.HasValue); var res = value.Value(); Assert.True(res.y >= 20 && res.y < 30); Assert.Equal(40, res.z.Count); Assert.All(res.z, z => { Assert.True(z >= 30 && z < 100); }); Assert.True(res.s >= 4.5 && res.s < 8.9); Assert.Equal(20, res.r.Count); Assert.All(res.r, r => { Assert.True(r >= 4.5 && r < 8.9); }); //This was tested by hand, but only visually, not via a frequentist test. var gaussian = string.Join(";", res.p); init = 0; value = await computation.Run.RunRandom().Run(); Assert.False(value.HasValue); }