From 1b629aaae4b2cf131fe1d5aee44880f7c2805405 Mon Sep 17 00:00:00 2001 From: Brandon Lucas Date: Fri, 20 Feb 2026 19:21:26 -0500 Subject: [PATCH] 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 --- src/codegen/js_backend.rs | 61 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/codegen/js_backend.rs b/src/codegen/js_backend.rs index 283c298..cbd119d 100644 --- a/src/codegen/js_backend.rs +++ b/src/codegen/js_backend.rs @@ -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,