feat: add File.copy and propagate effectful callback effects (WISH-7, WISH-14)
File.copy(source, dest) copies files via interpreter (std::fs::copy) and C backend (fread/fwrite). Effectful callbacks passed to higher-order functions like List.map/forEach now propagate their effects to the enclosing function's inferred effect set. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3864,6 +3864,30 @@ impl Interpreter {
|
||||
}
|
||||
}
|
||||
|
||||
("File", "copy") => {
|
||||
let source = match request.args.first() {
|
||||
Some(Value::String(s)) => s.clone(),
|
||||
_ => return Err(RuntimeError {
|
||||
message: "File.copy requires a string source path".to_string(),
|
||||
span: None,
|
||||
}),
|
||||
};
|
||||
let dest = match request.args.get(1) {
|
||||
Some(Value::String(s)) => s.clone(),
|
||||
_ => return Err(RuntimeError {
|
||||
message: "File.copy requires a string destination path".to_string(),
|
||||
span: None,
|
||||
}),
|
||||
};
|
||||
match std::fs::copy(&source, &dest) {
|
||||
Ok(_) => Ok(Value::Unit),
|
||||
Err(e) => Err(RuntimeError {
|
||||
message: format!("Failed to copy '{}' to '{}': {}", source, dest, e),
|
||||
span: None,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
// ===== Process Effect =====
|
||||
("Process", "exec") => {
|
||||
use std::process::Command;
|
||||
|
||||
Reference in New Issue
Block a user