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,