builtin mix; fixed vectorized equality
This commit is contained in:
parent
d77f844c81
commit
91f401a13a
@ -746,6 +746,36 @@ static Result<Value> builtin_incoming(Interpreter &i, std::vector<Value> args)
|
|||||||
return Value{};
|
return Value{};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Interleaves arguments
|
||||||
|
static Result<Value> builtin_mix(Interpreter &i, std::vector<Value> args)
|
||||||
|
{
|
||||||
|
std::vector<Value> result;
|
||||||
|
|
||||||
|
std::unordered_map<std::size_t, std::size_t> indicies;
|
||||||
|
|
||||||
|
size_t awaiting_containers = std::count_if(args.begin(), args.end(), [](Value const& v) { return is_indexable(v.type); });
|
||||||
|
|
||||||
|
// Algorithm description:
|
||||||
|
// Repeat until all arguments were exhausted:
|
||||||
|
// For each argument:
|
||||||
|
// If it can be iterated then add current element to the list and move to the next one.
|
||||||
|
// If next element cannot be retrived mark container as exhausted and start from beginning
|
||||||
|
// Otherwise append element to the list
|
||||||
|
do {
|
||||||
|
for (size_t idx = 0; idx < args.size(); ++idx) {
|
||||||
|
if (auto &arg = args[idx]; is_indexable(arg.type)) {
|
||||||
|
result.push_back(Try(arg.index(i, indicies[idx]++ % arg.size())));
|
||||||
|
if (indicies[idx] == arg.size())
|
||||||
|
awaiting_containers--;
|
||||||
|
} else {
|
||||||
|
result.push_back(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (awaiting_containers);
|
||||||
|
|
||||||
|
return Value::from(std::move(result));
|
||||||
|
}
|
||||||
|
|
||||||
void Interpreter::register_builtin_functions()
|
void Interpreter::register_builtin_functions()
|
||||||
{
|
{
|
||||||
auto &global = *Env::global;
|
auto &global = *Env::global;
|
||||||
@ -764,6 +794,7 @@ void Interpreter::register_builtin_functions()
|
|||||||
global.force_define("len", builtin_len);
|
global.force_define("len", builtin_len);
|
||||||
global.force_define("max", builtin_max);
|
global.force_define("max", builtin_max);
|
||||||
global.force_define("min", builtin_min);
|
global.force_define("min", builtin_min);
|
||||||
|
global.force_define("mix", builtin_mix);
|
||||||
global.force_define("note_off", builtin_note_off);
|
global.force_define("note_off", builtin_note_off);
|
||||||
global.force_define("note_on", builtin_note_on);
|
global.force_define("note_on", builtin_note_on);
|
||||||
global.force_define("nprimes", builtin_primes);
|
global.force_define("nprimes", builtin_primes);
|
||||||
|
@ -136,7 +136,14 @@ static Result<Value> equality_operator(Interpreter &interpreter, std::vector<Val
|
|||||||
std::vector<Value> result;
|
std::vector<Value> result;
|
||||||
result.reserve(args[0].size());
|
result.reserve(args[0].size());
|
||||||
for (auto i = 0u; i < args[0].size(); ++i) {
|
for (auto i = 0u; i < args[0].size(); ++i) {
|
||||||
result.push_back(Value::from(Try(args[0].index(interpreter, i)) == args[1]));
|
result.push_back(
|
||||||
|
Value::from(
|
||||||
|
Binary_Predicate{}(
|
||||||
|
Try(args[0].index(interpreter, i)),
|
||||||
|
args[1]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return Value::from(Array { std::move(result) });
|
return Value::from(Array { std::move(result) });
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user