module rng;

public interface IRngCore
{
    [mutating]
    public uint64_t next();

    [mutating]
    public float next_float();
}

uint64_t rotl(uint64_t x, int k)
{
    return (x << k) | (x >> (64 - k));
}

float u64_to_float(uint64_t x)
{
    return 0;
}

public struct Xoroshiro128Plus : IRngCore
{
    internal uint64_t s0;
    internal uint64_t s1;

    [mutating]
    public uint64_t next()
    {
        var result = s0 + s1;

        s1 ^= s0;
        s0 = rotl(s0, 24) ^ s1 ^ (s1 << 16);
        s1 = rotl(s1, 37);

        return result;
    }

    [mutating]
    public float next_float()
    {
        return u64_to_float(next());
    }
}