Current section

Files

Jump to
yog src yog@internal@random.erl
Raw

src/yog@internal@random.erl

-module(yog@internal@random).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/yog/internal/random.gleam").
-export([new/1, next_int/2, next_float/1, shuffle/2]).
-export_type([rng/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-opaque rng() :: {rng, prng@random:seed()}.
-file("src/yog/internal/random.gleam", 12).
?DOC(false).
-spec new(gleam@option:option(integer())) -> rng().
new(Seed) ->
S@1 = case Seed of
{some, S} ->
S;
none ->
gleam@int:random(2147483647)
end,
{rng, prng_ffi:new_seed(S@1)}.
-file("src/yog/internal/random.gleam", 21).
?DOC(false).
-spec next_int(rng(), integer()) -> {integer(), rng()}.
next_int(Rng, Limit) ->
case Limit =< 0 of
true ->
{0, Rng};
false ->
{Val, Next_seed} = prng@random:step(
prng@random:int(0, Limit - 1),
erlang:element(2, Rng)
),
{Val, {rng, Next_seed}}
end.
-file("src/yog/internal/random.gleam", 32).
?DOC(false).
-spec next_float(rng()) -> {float(), rng()}.
next_float(Rng) ->
{Val, Next_seed} = prng@random:step(
prng@random:float(+0.0, 1.0),
erlang:element(2, Rng)
),
{Val, {rng, Next_seed}}.
-file("src/yog/internal/random.gleam", 38).
?DOC(false).
-spec shuffle(list(EAT), rng()) -> {list(EAT), rng()}.
shuffle(List, Rng) ->
{Shuffled, Next_seed} = prng@random:step(
prng@random:shuffle(List),
erlang:element(2, Rng)
),
{Shuffled, {rng, Next_seed}}.