050 transform impl pattern

✓ Passing This code compiles and runs correctly.

Code

const std = @import("std");
const ast = @import("ast");
const Program = ast.Program;
const Item = ast.Item;

~[keyword|comptime|transform]pub event sample_transform {
    item: *const Item,
    program: *const Program,
    allocator: std.mem.Allocator
}
| transformed { program: *const Program }

~[norun]pub event sample_impl {}

~proc sample_transform {
    // Deriving flow from item as in io.kz
    const flow = if (item.* == .flow)
        &item.flow
    else if (item.* == .subflow_impl and item.subflow_impl.body == .flow)
        &item.subflow_impl.body.flow
    else
        return .{ .transformed = .{ .program = program } };

    const segments = allocator.alloc([]const u8, 1) catch unreachable;
    segments[0] = "sample_impl";
    
    var new_inv = flow.invocation;
    new_inv.path = ast.DottedPath{
        .segments = segments,
        .module_qualifier = "input"
    };
    new_inv.annotations = &[_][]const u8{ "@pass_ran(\"transform\")" };

    const transformed_flow = ast.Flow{
        .invocation = new_inv,
        .continuations = flow.continuations,
        .inline_body = "    // lowered\n",
        .location = flow.location,
        .module = flow.module,
    };
    const ast_functional = @import("ast_functional");
    const new_program = ast_functional.replaceFlowRecursive(allocator, program, flow, .{ .flow = transformed_flow }) catch unreachable;
    const result_ptr = allocator.create(ast.Program) catch unreachable;
    result_ptr.* = new_program.?;
    return .{ .transformed = .{ .program = result_ptr } };
}

~sample_transform()
input.kz