#[allow(unused_imports)]
use crate::aver_generated::domain::ast::*;
#[allow(unused_imports)]
use crate::aver_generated::domain::eval::*;
#[allow(unused_imports)]
use crate::aver_generated::domain::lexer::*;
#[allow(unused_imports)]
use crate::aver_generated::domain::parser::*;
#[allow(unused_imports)]
use crate::aver_generated::domain::resolver::*;
#[allow(unused_imports)]
use crate::aver_generated::domain::token::*;
#[allow(unused_imports)]
use crate::aver_generated::domain::value::*;
#[allow(unused_imports)]
use crate::*;
#[allow(non_camel_case_types)]
enum __MutualTco1 {
LoadModules(
aver_rt::AverList<AverStr>,
AverStr,
aver_rt::AverList<FnDef>,
aver_rt::AverMap<AverStr, bool>,
),
LoadOneModule(
AverStr,
aver_rt::AverList<AverStr>,
AverStr,
aver_rt::AverList<FnDef>,
aver_rt::AverMap<AverStr, bool>,
),
}
fn __mutual_tco_trampoline_1(
mut __state: __MutualTco1,
) -> Result<(aver_rt::AverList<FnDef>, aver_rt::AverMap<AverStr, bool>), AverStr> {
loop {
__state = match __state {
__MutualTco1::LoadModules(mut deps, mut moduleRoot, mut acc, mut loaded) => {
crate::cancel_checkpoint();
aver_list_match!(deps, [] => { return Ok((acc, loaded)) }, [dep, rest] => if loaded.contains_key(&dep) { __MutualTco1::LoadModules(rest, moduleRoot, acc, loaded) } else { __MutualTco1::LoadOneModule(dep, rest, moduleRoot, acc, loaded) })
}
__MutualTco1::LoadOneModule(mut dep, mut rest, mut moduleRoot, mut acc, mut loaded) => {
crate::cancel_checkpoint();
let path = findModulePath(
dep.clone(),
moduleRoot.clone(),
aver_rt::AverInt::from_i64(0),
);
let source = {
let __effect_arg0 = path;
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Disk.readText",
vec![aver_replay::ReplayValue::to_replay_json(&__effect_arg0)],
|| (aver_rt::read_text(&__effect_arg0)).into_aver(),
)
}?;
let tokens = crate::aver_generated::domain::lexer::lex(source);
let prog = crate::aver_generated::domain::parser::parse(&tokens)?;
let moduleFns = resolveQualifiedModuleFns(&prog, dep.clone());
let loaded2 = loaded.insert_owned(dep, true);
let innerResult = loadModules(&prog.deps, moduleRoot.clone(), &acc, &loaded2)?;
{
let (accWithInner, loaded3) = innerResult;
__MutualTco1::LoadModules(
rest,
moduleRoot,
aver_rt::AverList::concat(
&accWithInner.clone(),
&shiftFnIdsInFns(
moduleFns,
aver_rt::AverInt::from_i64(accWithInner.len() as i64),
aver_rt::AverList::empty(),
),
),
loaded3,
)
}
}
};
}
}
pub fn loadModules(
deps: &aver_rt::AverList<AverStr>,
moduleRoot: AverStr,
acc: &aver_rt::AverList<FnDef>,
loaded: &aver_rt::AverMap<AverStr, bool>,
) -> Result<(aver_rt::AverList<FnDef>, aver_rt::AverMap<AverStr, bool>), AverStr> {
__mutual_tco_trampoline_1(__MutualTco1::LoadModules(
deps.clone(),
moduleRoot,
acc.clone(),
loaded.clone(),
))
}
pub fn loadOneModule(
dep: AverStr,
rest: &aver_rt::AverList<AverStr>,
moduleRoot: AverStr,
acc: &aver_rt::AverList<FnDef>,
loaded: &aver_rt::AverMap<AverStr, bool>,
) -> Result<(aver_rt::AverList<FnDef>, aver_rt::AverMap<AverStr, bool>), AverStr> {
__mutual_tco_trampoline_1(__MutualTco1::LoadOneModule(
dep,
rest.clone(),
moduleRoot,
acc.clone(),
loaded.clone(),
))
}
#[allow(non_camel_case_types)]
enum __MutualTco2 {
QualifyFns(aver_rt::AverList<FnDef>, AverStr, aver_rt::AverList<FnDef>),
QualifyFnsOne(
FnDef,
aver_rt::AverList<FnDef>,
AverStr,
aver_rt::AverList<FnDef>,
),
}
fn __mutual_tco_trampoline_2(mut __state: __MutualTco2) -> aver_rt::AverList<FnDef> {
loop {
__state = match __state {
__MutualTco2::QualifyFns(mut fns, mut prefix, mut acc) => {
crate::cancel_checkpoint();
aver_list_match!(fns, [] => { return acc.reverse() }, [f, rest] => __MutualTco2::QualifyFnsOne(f, rest, prefix, acc))
}
__MutualTco2::QualifyFnsOne(mut f, mut rest, mut prefix, mut acc) => {
crate::cancel_checkpoint();
let qualified = crate::aver_generated::domain::ast::FnDef {
name: ((prefix.clone() + &AverStr::from(".")) + &f.name),
params: f.params.clone(),
body: f.body.clone(),
slotCount: f.slotCount.clone(),
slotMap: f.slotMap.clone(),
fastPath: f.fastPath.clone(),
tailLoop: f.tailLoop,
};
__MutualTco2::QualifyFns(
rest,
prefix,
aver_rt::AverList::prepend(f, &aver_rt::AverList::prepend(qualified, &acc)),
)
}
};
}
}
pub fn qualifyFns(
fns: &aver_rt::AverList<FnDef>,
prefix: AverStr,
acc: &aver_rt::AverList<FnDef>,
) -> aver_rt::AverList<FnDef> {
__mutual_tco_trampoline_2(__MutualTco2::QualifyFns(fns.clone(), prefix, acc.clone()))
}
pub fn qualifyFnsOne(
f: &FnDef,
rest: &aver_rt::AverList<FnDef>,
prefix: AverStr,
acc: &aver_rt::AverList<FnDef>,
) -> aver_rt::AverList<FnDef> {
__mutual_tco_trampoline_2(__MutualTco2::QualifyFnsOne(
f.clone(),
rest.clone(),
prefix,
acc.clone(),
))
}
pub fn run(source: AverStr) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
let tokens = crate::aver_generated::domain::lexer::lex(source);
let prog = crate::aver_generated::domain::parser::parse(&tokens)?;
let resolved = crate::aver_generated::domain::resolver::resolveProgram(&prog);
runGuestProgram(
&resolved,
&aver_rt::AverList::empty(),
&aver_rt::AverList::empty(),
)
}
pub fn runWithModules(source: AverStr, moduleRoot: AverStr) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
let prepared = prepareProgramWithModules(source, moduleRoot)?;
{
let (prog, moduleFns) = prepared;
runGuestProgram(&prog, &moduleFns, &aver_rt::AverList::empty())
}
}
pub fn prepareProgramWithModules(
source: AverStr,
moduleRoot: AverStr,
) -> Result<(Program, aver_rt::AverList<FnDef>), AverStr> {
crate::cancel_checkpoint();
let tokens = crate::aver_generated::domain::lexer::lex(source);
let prog = crate::aver_generated::domain::parser::parse(&tokens)?;
let resolved = crate::aver_generated::domain::resolver::resolveProgram(&prog);
let r = loadModules(
&resolved.deps,
moduleRoot,
&aver_rt::AverList::empty(),
&HashMap::new(),
)?;
{
let (moduleFns, _) = r;
Ok((resolved, moduleFns))
}
}
pub fn runGuestProgram(
prog: &Program,
moduleFns: &aver_rt::AverList<FnDef>,
guestArgs: &aver_rt::AverList<AverStr>,
) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
crate::aver_generated::domain::eval::evalProgramWithFns(
&shiftFnIdsInProgram(prog, aver_rt::AverInt::from_i64(moduleFns.len() as i64)),
moduleFns,
)
}
pub fn runGuestCliProgram(
prog: &Program,
moduleFns: &aver_rt::AverList<FnDef>,
localFns: &aver_rt::AverList<FnDef>,
guestArgs: &aver_rt::AverList<AverStr>,
) -> Result<Val, AverStr> {
let __replay_input = aver_replay::ReplayValue::to_replay_json(guestArgs);
aver_replay::with_guest_scope_args_result(
"runGuestCliProgram",
__replay_input,
guestArgs.clone(),
|| {
crate::self_host_support::with_program_fn_store(
prog.fns.clone(),
moduleFns.clone(),
|| {
crate::cancel_checkpoint();
match runGuestProgram(prog, moduleFns, guestArgs) {
Ok(result) => finishCliRun(localFns, &result),
Err(e) => Err((AverStr::from("Runtime error: ") + &e)),
}
},
)
},
)
}
pub fn findModulePath(mut dep: AverStr, mut root: AverStr, mut depth: aver_rt::AverInt) -> AverStr {
loop {
crate::cancel_checkpoint();
let path = modulePathFromName(dep.clone(), root.clone());
if {
let __effect_arg0 = path.clone();
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Disk.exists",
vec![aver_replay::ReplayValue::to_replay_json(&__effect_arg0)],
|| aver_rt::path_exists(&__effect_arg0),
)
} {
return path;
} else {
if (depth < aver_rt::AverInt::from_i64(3)) {
{
let __tco1 = (root + &AverStr::from("/.."));
let __tco2 = depth.add(&aver_rt::AverInt::from_i64(1));
root = __tco1;
depth = __tco2;
continue;
}
} else {
return path;
}
}
}
}
pub fn modulePathFromName(name: AverStr, moduleRoot: AverStr) -> AverStr {
crate::cancel_checkpoint();
(((moduleRoot + &AverStr::from("/"))
+ &dotToSlash(
name.clone(),
aver_rt::AverInt::from_i64(0),
aver_rt::AverInt::from_i64(name.chars().count() as i64),
AverStr::from(""),
))
+ &AverStr::from(".av"))
}
#[inline(always)]
pub fn dotToSlash(
mut name: AverStr,
mut pos: aver_rt::AverInt,
mut total: aver_rt::AverInt,
mut acc: AverStr,
) -> AverStr {
loop {
crate::cancel_checkpoint();
let nextPos = pos.add(&aver_rt::AverInt::from_i64(1));
if (pos < total) {
match ((pos)
.to_usize()
.and_then(|__i| name.chars().nth(__i).map(|c| c.to_string())))
.into_aver()
{
Some(c) => {
if (c == AverStr::from(".")) {
{
let __tco1 = nextPos;
let __tco3 = (acc + &AverStr::from("/"));
pos = __tco1;
acc = __tco3;
continue;
}
} else {
{
let __tco1 = nextPos;
let __tco3 = (acc + &(c.to_lowercase()).into_aver());
pos = __tco1;
acc = __tco3;
continue;
}
}
}
None => {
return acc;
}
}
} else {
return acc;
}
}
}
pub fn resolveQualifiedModuleFns(prog: &Program, dep: AverStr) -> aver_rt::AverList<FnDef> {
crate::cancel_checkpoint();
let qualifiedProg = crate::aver_generated::domain::ast::Program {
deps: prog.deps.clone(),
fns: qualifyFns(&prog.fns, dep, &aver_rt::AverList::empty()),
stmts: prog.stmts.clone(),
};
crate::aver_generated::domain::resolver::resolveProgram(&qualifiedProg).fns
}
#[inline(always)]
pub fn shiftFnIdsInFns(
mut fns: aver_rt::AverList<FnDef>,
mut offset: aver_rt::AverInt,
mut acc: aver_rt::AverList<FnDef>,
) -> aver_rt::AverList<FnDef> {
loop {
crate::cancel_checkpoint();
aver_list_match!(fns, [] => { return acc.reverse(); }, [fd, rest] => { {
let __tco0 = rest;
let __tco1 = offset.clone();
let __tco2 = aver_rt::AverList::prepend(shiftFnIdsInFn(&fd, offset), &acc);
fns = __tco0;
offset = __tco1;
acc = __tco2;
continue;
} })
}
}
pub fn shiftFnIdsInProgram(prog: &Program, offset: aver_rt::AverInt) -> Program {
crate::cancel_checkpoint();
crate::aver_generated::domain::ast::Program {
deps: prog.deps.clone(),
fns: shiftFnIdsInFns(prog.fns.clone(), offset.clone(), aver_rt::AverList::empty()),
stmts: shiftFnIdsInStmts(prog.stmts.clone(), offset, aver_rt::AverList::empty()),
}
}
pub fn shiftFnIdsInFn(fd: &FnDef, offset: aver_rt::AverInt) -> FnDef {
crate::cancel_checkpoint();
crate::aver_generated::domain::ast::FnDef {
name: fd.name.clone(),
params: fd.params.clone(),
body: shiftFnIdsInStmts(fd.body.clone(), offset.clone(), aver_rt::AverList::empty()),
slotCount: fd.slotCount.clone(),
slotMap: fd.slotMap.clone(),
fastPath: shiftFnIdsInFastPath(&fd.fastPath, offset),
tailLoop: fd.tailLoop,
}
}
pub fn shiftFnIdsInFastPath(path: &FnFastPath, offset: aver_rt::AverInt) -> FnFastPath {
crate::cancel_checkpoint();
match path.clone() {
crate::aver_generated::domain::ast::FnFastPath::FastForwardCall(targetId, slotArgs) => {
crate::aver_generated::domain::ast::FnFastPath::FastForwardCall(
targetId.add(&offset),
slotArgs,
)
}
_ => path.clone(),
}
}
#[inline(always)]
pub fn shiftFnIdsInStmts(
mut stmts: aver_rt::AverList<Stmt>,
mut offset: aver_rt::AverInt,
mut acc: aver_rt::AverList<Stmt>,
) -> aver_rt::AverList<Stmt> {
loop {
crate::cancel_checkpoint();
aver_list_match!(stmts, [] => { return acc.reverse(); }, [stmt, rest] => { {
let __tco0 = rest;
let __tco1 = offset.clone();
let __tco2 = aver_rt::AverList::prepend(shiftFnIdsInStmt(&stmt, offset), &acc);
stmts = __tco0;
offset = __tco1;
acc = __tco2;
continue;
} })
}
}
pub fn shiftFnIdsInStmt(stmt: &Stmt, offset: aver_rt::AverInt) -> Stmt {
crate::cancel_checkpoint();
match stmt.clone() {
crate::aver_generated::domain::ast::Stmt::StmtBind(name, expr) => {
crate::aver_generated::domain::ast::Stmt::StmtBind(
name,
shiftFnIdsInExpr(&expr, offset),
)
}
crate::aver_generated::domain::ast::Stmt::StmtBindSlot(slot, expr) => {
crate::aver_generated::domain::ast::Stmt::StmtBindSlot(
slot,
shiftFnIdsInExpr(&expr, offset),
)
}
crate::aver_generated::domain::ast::Stmt::StmtExpr(expr) => {
crate::aver_generated::domain::ast::Stmt::StmtExpr(shiftFnIdsInExpr(&expr, offset))
}
}
}
pub fn shiftFnIdsInExpr(expr: &Expr, offset: aver_rt::AverInt) -> Expr {
crate::cancel_checkpoint();
match expr.clone() {
crate::aver_generated::domain::ast::Expr::ExprBoolBranch(cond, thenExpr, elseExpr) => {
let cond = (*cond).clone();
let thenExpr = (*thenExpr).clone();
let elseExpr = (*elseExpr).clone();
crate::aver_generated::domain::ast::Expr::ExprBoolBranch(
std::sync::Arc::new(shiftFnIdsInExpr(&cond, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&thenExpr, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&elseExpr, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprVectorGetOrInt(
vecExpr,
idxExpr,
defaultValue,
) => {
let vecExpr = (*vecExpr).clone();
let idxExpr = (*idxExpr).clone();
crate::aver_generated::domain::ast::Expr::ExprVectorGetOrInt(
std::sync::Arc::new(shiftFnIdsInExpr(&vecExpr, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&idxExpr, offset)),
defaultValue,
)
}
crate::aver_generated::domain::ast::Expr::ExprIntModOrInt(a, b, defaultValue) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprIntModOrInt(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
defaultValue,
)
}
crate::aver_generated::domain::ast::Expr::ExprAdd(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprAdd(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprSub(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprSub(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprMul(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprMul(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprDiv(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprDiv(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprEq(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprEq(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprNeq(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprNeq(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
_ => shiftFnIdsInExprTail(expr, offset),
}
}
pub fn shiftFnIdsInExprTail(expr: &Expr, offset: aver_rt::AverInt) -> Expr {
crate::cancel_checkpoint();
match expr.clone() {
crate::aver_generated::domain::ast::Expr::ExprLt(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprLt(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprGt(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprGt(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprLte(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprLte(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprGte(a, b) => {
let a = (*a).clone();
let b = (*b).clone();
crate::aver_generated::domain::ast::Expr::ExprGte(
std::sync::Arc::new(shiftFnIdsInExpr(&a, offset.clone())),
std::sync::Arc::new(shiftFnIdsInExpr(&b, offset)),
)
}
crate::aver_generated::domain::ast::Expr::ExprConcat(parts) => {
crate::aver_generated::domain::ast::Expr::ExprConcat(shiftFnIdsInExprs(
parts,
offset,
aver_rt::AverList::empty(),
))
}
crate::aver_generated::domain::ast::Expr::ExprTuple(exprs) => {
crate::aver_generated::domain::ast::Expr::ExprTuple(shiftFnIdsInExprs(
exprs,
offset,
aver_rt::AverList::empty(),
))
}
crate::aver_generated::domain::ast::Expr::ExprList(exprs) => {
crate::aver_generated::domain::ast::Expr::ExprList(shiftFnIdsInExprs(
exprs,
offset,
aver_rt::AverList::empty(),
))
}
crate::aver_generated::domain::ast::Expr::ExprRecord(name, fields) => {
crate::aver_generated::domain::ast::Expr::ExprRecord(
name,
shiftFnIdsInFields(fields, offset, aver_rt::AverList::empty()),
)
}
_ => shiftFnIdsInExprCalls(expr, offset),
}
}
pub fn shiftFnIdsInExprCalls(expr: &Expr, offset: aver_rt::AverInt) -> Expr {
crate::cancel_checkpoint();
match expr.clone() {
crate::aver_generated::domain::ast::Expr::ExprFieldAccess(obj, field) => {
let obj = (*obj).clone();
crate::aver_generated::domain::ast::Expr::ExprFieldAccess(
std::sync::Arc::new(shiftFnIdsInExpr(&obj, offset)),
field,
)
}
crate::aver_generated::domain::ast::Expr::ExprCall(name, args) => {
crate::aver_generated::domain::ast::Expr::ExprCall(
name,
shiftFnIdsInExprs(args, offset, aver_rt::AverList::empty()),
)
}
crate::aver_generated::domain::ast::Expr::ExprCallDirect(fnId, args) => {
crate::aver_generated::domain::ast::Expr::ExprCallDirect(
fnId.add(&offset),
shiftFnIdsInExprs(args, offset, aver_rt::AverList::empty()),
)
}
crate::aver_generated::domain::ast::Expr::ExprCallBuiltin(name, args) => {
crate::aver_generated::domain::ast::Expr::ExprCallBuiltin(
name,
shiftFnIdsInExprs(args, offset, aver_rt::AverList::empty()),
)
}
crate::aver_generated::domain::ast::Expr::ExprCallBuiltinId(id, args) => {
crate::aver_generated::domain::ast::Expr::ExprCallBuiltinId(
id,
shiftFnIdsInExprs(args, offset, aver_rt::AverList::empty()),
)
}
crate::aver_generated::domain::ast::Expr::ExprMatch(scrutinee, arms) => {
let scrutinee = (*scrutinee).clone();
crate::aver_generated::domain::ast::Expr::ExprMatch(
std::sync::Arc::new(shiftFnIdsInExpr(&scrutinee, offset.clone())),
shiftFnIdsInArms(arms, offset, aver_rt::AverList::empty()),
)
}
crate::aver_generated::domain::ast::Expr::ExprPropagate(inner) => {
let inner = (*inner).clone();
crate::aver_generated::domain::ast::Expr::ExprPropagate(std::sync::Arc::new(
shiftFnIdsInExpr(&inner, offset),
))
}
crate::aver_generated::domain::ast::Expr::ExprIndependentProduct(exprs, unwrap) => {
crate::aver_generated::domain::ast::Expr::ExprIndependentProduct(
shiftFnIdsInExprs(exprs, offset, aver_rt::AverList::empty()),
unwrap,
)
}
_ => expr.clone(),
}
}
#[inline(always)]
pub fn shiftFnIdsInExprs(
mut exprs: aver_rt::AverList<Expr>,
mut offset: aver_rt::AverInt,
mut acc: aver_rt::AverList<Expr>,
) -> aver_rt::AverList<Expr> {
loop {
crate::cancel_checkpoint();
aver_list_match!(exprs, [] => { return acc.reverse(); }, [expr, rest] => { {
let __tco0 = rest;
let __tco1 = offset.clone();
let __tco2 = aver_rt::AverList::prepend(shiftFnIdsInExpr(&expr, offset), &acc);
exprs = __tco0;
offset = __tco1;
acc = __tco2;
continue;
} })
}
}
#[inline(always)]
pub fn shiftFnIdsInFields(
mut fields: aver_rt::AverList<(AverStr, Expr)>,
mut offset: aver_rt::AverInt,
mut acc: aver_rt::AverList<(AverStr, Expr)>,
) -> aver_rt::AverList<(AverStr, Expr)> {
loop {
crate::cancel_checkpoint();
aver_list_match!(fields, [] => { return acc.reverse(); }, [pair, rest] => { { let (name, expr) = pair; {
let __tco0 = rest;
let __tco1 = offset.clone();
let __tco2 = aver_rt::AverList::prepend((name, shiftFnIdsInExpr(&expr, offset)), &acc);
fields = __tco0;
offset = __tco1;
acc = __tco2;
continue;
} } })
}
}
#[inline(always)]
pub fn shiftFnIdsInArms(
mut arms: aver_rt::AverList<MatchArm>,
mut offset: aver_rt::AverInt,
mut acc: aver_rt::AverList<MatchArm>,
) -> aver_rt::AverList<MatchArm> {
loop {
crate::cancel_checkpoint();
aver_list_match!(arms, [] => { return acc.reverse(); }, [arm, rest] => { {
let __tco0 = rest;
let __tco1 = offset.clone();
let __tco2 = aver_rt::AverList::prepend(crate::aver_generated::domain::ast::MatchArm { pattern: arm.pattern.clone(), body: shiftFnIdsInExpr(&arm.body, offset), bindingSlots: arm.bindingSlots.clone() }, &acc);
arms = __tco0;
offset = __tco1;
acc = __tco2;
continue;
} })
}
}
pub fn runRepr(source: AverStr) -> AverStr {
crate::cancel_checkpoint();
match run(source) {
Ok(val) => crate::aver_generated::domain::value::valRepr(&val),
Err(e) => aver_rt::AverStr::from({
let mut __b = {
let mut __b = aver_rt::Buffer::with_capacity(
(aver_rt::AverInt::from_i64(23)).to_usize().unwrap_or(0),
);
__b.push_str(&AverStr::from("ERROR: "));
__b
};
__b.push_str(&aver_rt::AverStr::from(aver_rt::aver_display(&(e))));
__b
}),
}
}
pub fn runFile(path: AverStr, moduleRoot: AverStr) -> Result<AverStr, AverStr> {
crate::cancel_checkpoint();
match loadProgramFromFile(path, moduleRoot) {
Ok(pair) => {
let (prog, moduleFns) = pair;
runFileLoaded(&prog, &moduleFns)
}
Err(e) => Err(e),
}
}
pub fn runFileLoaded(
prog: &Program,
moduleFns: &aver_rt::AverList<FnDef>,
) -> Result<AverStr, AverStr> {
crate::cancel_checkpoint();
match runGuestProgram(prog, moduleFns, &aver_rt::AverList::empty()) {
Ok(val) => Ok(crate::aver_generated::domain::value::valRepr(&val)),
Err(e) => Err(e),
}
}
pub fn loadProgramFromFile(
path: AverStr,
moduleRoot: AverStr,
) -> Result<(Program, aver_rt::AverList<FnDef>), AverStr> {
crate::cancel_checkpoint();
let source = {
let __effect_arg0 = path;
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Disk.readText",
vec![aver_replay::ReplayValue::to_replay_json(&__effect_arg0)],
|| (aver_rt::read_text(&__effect_arg0)).into_aver(),
)
}?;
prepareProgramWithModules(source, moduleRoot)
}
pub fn runFromFileWithRest(
path: AverStr,
rest: &aver_rt::AverList<AverStr>,
) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
aver_list_match!(rest.clone(), [] => runCliFile(path, AverStr::from("."), &aver_rt::AverList::empty()), [moduleRoot, guestArgs] => runCliFile(path, moduleRoot, &guestArgs))
}
pub fn runCliFile(
path: AverStr,
moduleRoot: AverStr,
guestArgs: &aver_rt::AverList<AverStr>,
) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
let prepared = loadProgramFromFile(path, moduleRoot)?;
{
let (prog, moduleFns) = prepared;
runGuestCliProgram(&prog, &moduleFns, &prog.fns, guestArgs)
}
}
#[inline(always)]
pub fn finishCliRun(localFns: &aver_rt::AverList<FnDef>, result: &Val) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
if hasLocalMain(localFns.clone()) {
finishCliMainResult(result)
} else {
Ok(result.clone())
}
}
pub fn finishCliMainResult(result: &Val) -> Result<Val, AverStr> {
crate::cancel_checkpoint();
match result.clone() {
crate::aver_generated::domain::value::Val::ValErr(err) => {
let err = (*err).clone();
Err((AverStr::from("Main returned error: ")
+ &crate::aver_generated::domain::value::valRepr(&err)))
}
_ => Ok(result.clone()),
}
}
#[inline(always)]
pub fn hasLocalMain(mut fns: aver_rt::AverList<FnDef>) -> bool {
loop {
crate::cancel_checkpoint();
aver_list_match!(fns, [] => { return false; }, [f, rest] => { if (f.name == AverStr::from("main")) { return true; } else { {
let __tco0 = rest;
fns = __tco0;
continue;
} } })
}
}
pub fn printIfNotUnit(s: AverStr) -> () {
crate::cancel_checkpoint();
if (s == AverStr::from("()")) {
{
let __effect_arg0 = AverStr::from("");
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
}
} else {
{
let __effect_arg0 = s;
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
}
}
}
pub fn runDemo() -> Result<(), AverStr> {
crate::cancel_checkpoint();
let demoArithmetic = runRepr(AverStr::from("x = 3 + 4\nx * 2"));
let demoDouble = runRepr(AverStr::from("fn double(n)\n n + n\n\ndouble(21)"));
let demoFib = runRepr(AverStr::from(
"fn fib(n)\n match n\n 0 -> 0\n 1 -> 1\n _ -> fib(n - 1) + fib(n - 2)\n\nfib(10)",
));
{
let __effect_arg0 = AverStr::from("=== Self-Hosted Mini Aver ===");
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = AverStr::from("");
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = AverStr::from(
"Usage: aver run self_hosted/main.av --module-root self_hosted -- <file.av> <module-root> [guest args...]",
);
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = AverStr::from("");
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = AverStr::from("Built-in demos:");
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = aver_rt::AverStr::from({
let mut __b = {
let mut __b = aver_rt::Buffer::with_capacity(
(aver_rt::AverInt::from_i64(31)).to_usize().unwrap_or(0),
);
__b.push_str(&AverStr::from(" x=3+4; x*2 = "));
__b
};
__b.push_str(&aver_rt::AverStr::from(aver_rt::aver_display(
&(demoArithmetic),
)));
__b
});
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = aver_rt::AverStr::from({
let mut __b = {
let mut __b = aver_rt::Buffer::with_capacity(
(aver_rt::AverInt::from_i64(31)).to_usize().unwrap_or(0),
);
__b.push_str(&AverStr::from(" double(21) = "));
__b
};
__b.push_str(&aver_rt::AverStr::from(aver_rt::aver_display(
&(demoDouble),
)));
__b
});
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
{
let __effect_arg0 = aver_rt::AverStr::from({
let mut __b = {
let mut __b = aver_rt::Buffer::with_capacity(
(aver_rt::AverInt::from_i64(28)).to_usize().unwrap_or(0),
);
__b.push_str(&AverStr::from(" fib(10) = "));
__b
};
__b.push_str(&aver_rt::AverStr::from(aver_rt::aver_display(&(demoFib))));
__b
});
crate::cancel_checkpoint();
aver_replay::invoke_effect(
"Console.print",
vec![serde_json::Value::String(format!("{}", __effect_arg0))],
|| aver_rt::console_print(&__effect_arg0),
)
};
Ok(())
}
pub fn main() -> Result<(), AverStr> {
crate::cancel_checkpoint();
let args = {
crate::cancel_checkpoint();
aver_replay::invoke_effect("Args.get", vec![], || aver_replay::current_cli_args())
};
aver_list_match!(args, [] => runDemo(), [path, rest] => match runFromFileWithRest(path, &rest) { Ok(_) => { Ok(()) }, Err(e) => { Err(e) } })
}