vyre-libs 0.6.3

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
use super::*;

pub(crate) fn emit_scope_open_for_index(
    vast_nodes: &str,
    idx: Expr,
    out_name: &str,
    prefix: &str,
) -> Vec<Node> {
    let mut nodes = vec![Node::let_bind(out_name, Expr::u32(SENTINEL))];
    nodes.extend(emit_scope_open_scan_assign_for_index(
        vast_nodes, idx, out_name, prefix,
    ));
    nodes
}

pub(crate) fn emit_scope_open_scan_assign_for_index(
    vast_nodes: &str,
    idx: Expr,
    out_name: &str,
    prefix: &str,
) -> Vec<Node> {
    let depth = format!("{prefix}_depth");
    let scan = format!("{prefix}_scan");
    let rev = format!("{prefix}_idx");
    let kind = format!("{prefix}_kind");

    vec![
        Node::let_bind(&depth, Expr::u32(0)),
        Node::loop_for(
            &scan,
            Expr::u32(0),
            idx.clone(),
            vec![
                Node::let_bind(
                    &rev,
                    Expr::sub(Expr::sub(idx, Expr::u32(1)), Expr::var(&scan)),
                ),
                Node::let_bind(
                    &kind,
                    Expr::load(
                        vast_nodes,
                        Expr::mul(Expr::var(&rev), Expr::u32(VAST_NODE_STRIDE_U32)),
                    ),
                ),
                Node::if_then(
                    Expr::eq(Expr::var(&kind), Expr::u32(TOK_RBRACE)),
                    vec![Node::assign(
                        &depth,
                        Expr::add(Expr::var(&depth), Expr::u32(1)),
                    )],
                ),
                Node::if_then(
                    Expr::eq(Expr::var(out_name), Expr::u32(SENTINEL)),
                    vec![Node::if_then(
                        Expr::eq(Expr::var(&kind), Expr::u32(TOK_LBRACE)),
                        vec![Node::if_then_else(
                            Expr::eq(Expr::var(&depth), Expr::u32(0)),
                            vec![Node::assign(out_name, Expr::var(&rev))],
                            vec![Node::assign(
                                &depth,
                                Expr::sub(Expr::var(&depth), Expr::u32(1)),
                            )],
                        )],
                    )],
                ),
            ],
        ),
    ]
}