grino/lib/std/rand.hpp

40 lines
1.2 KiB
C++
Raw Normal View History

#include <random>
#include <chrono>
#include "src/Loader.hpp"
#include "src/Module.hpp"
extern "C" void lib_rand(grino::Loader& loader)
{
grino::Loc loc {"core/rand"};
auto mod = loader.add_module("rand");
mod->loader()->add_native("randf", [loc](auto args){
std::mt19937 r;
r.seed(std::chrono::steady_clock::now().time_since_epoch().count());
std::uniform_real_distribution<float> urd(0.0f, 1.0f);
return grino::Value::make_float(loc, urd(r));
2023-09-15 09:11:06 +00:00
}, std::make_shared<grino::Prototype>(std::vector<grino::TypeSlot>{
grino::TypeSlot {grino::HINT_CAT_RETURN, grino::TYPE_FLOAT},
}));
mod->loader()->add_native("range", [loc](auto args){
std::mt19937 r;
r.seed(std::chrono::steady_clock::now().time_since_epoch().count());
int from = args[0]->as_int();
int to = args[1]->as_int();
std::uniform_int_distribution<int> dist(from, to);
return grino::Value::make_int(loc, dist(r));
2023-09-15 09:11:06 +00:00
}, std::make_shared<grino::Prototype>(std::vector<grino::TypeSlot>{
grino::TypeSlot {grino::HINT_CAT_PARAM, grino::TYPE_INT},
grino::TypeSlot {grino::HINT_CAT_PARAM, grino::TYPE_INT},
grino::TypeSlot {grino::HINT_CAT_RETURN, grino::TYPE_INT},
}));
}