feat: add 10 missing List operations to JS backend

Add find, findIndex, any, all, zip, flatten, contains, take, drop,
and forEach to the JS backend's emit_list_operation function. These
operations previously worked in the interpreter and C backend but
caused "Unknown List operation" errors when compiled to JS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-20 19:21:26 -05:00
parent 0f8babfd8b
commit 1b629aaae4

View File

@@ -1835,6 +1835,67 @@ impl JsBackend {
let func = self.emit_expr(&args[1])?;
Ok(format!("[...{}].sort({})", list, func))
}
"find" => {
let list = self.emit_expr(&args[0])?;
let pred = self.emit_expr(&args[1])?;
Ok(format!(
"((__l) => {{ const __r = __l.find({}); return __r !== undefined ? Lux.Some(__r) : Lux.None(); }})({})",
pred, list
))
}
"findIndex" => {
let list = self.emit_expr(&args[0])?;
let pred = self.emit_expr(&args[1])?;
Ok(format!(
"((__l) => {{ const __i = __l.findIndex({}); return __i !== -1 ? Lux.Some(__i) : Lux.None(); }})({})",
pred, list
))
}
"any" => {
let list = self.emit_expr(&args[0])?;
let pred = self.emit_expr(&args[1])?;
Ok(format!("{}.some({})", list, pred))
}
"all" => {
let list = self.emit_expr(&args[0])?;
let pred = self.emit_expr(&args[1])?;
Ok(format!("{}.every({})", list, pred))
}
"zip" => {
let list1 = self.emit_expr(&args[0])?;
let list2 = self.emit_expr(&args[1])?;
Ok(format!(
"((__a, __b) => __a.slice(0, Math.min(__a.length, __b.length)).map((__x, __i) => [__x, __b[__i]]))({})",
format!("{}, {}", list1, list2)
))
}
"flatten" => {
let list = self.emit_expr(&args[0])?;
Ok(format!("{}.flat()", list))
}
"contains" => {
let list = self.emit_expr(&args[0])?;
let elem = self.emit_expr(&args[1])?;
Ok(format!(
"{}.some(__x => JSON.stringify(__x) === JSON.stringify({}))",
list, elem
))
}
"take" => {
let list = self.emit_expr(&args[0])?;
let n = self.emit_expr(&args[1])?;
Ok(format!("{}.slice(0, Math.max(0, {}))", list, n))
}
"drop" => {
let list = self.emit_expr(&args[0])?;
let n = self.emit_expr(&args[1])?;
Ok(format!("{}.slice(Math.max(0, {}))", list, n))
}
"forEach" => {
let list = self.emit_expr(&args[0])?;
let func = self.emit_expr(&args[1])?;
Ok(format!("({}.forEach({}), undefined)", list, func))
}
_ => Err(JsGenError {
message: format!("Unknown List operation: {}", operation),
span: None,