006 event purity

✓ Passing This code compiles and runs correctly.

Code

// Test event purity computation
// Event purity is computed from ALL proc implementations
// If ALL procs are pure -> event is pure
// If ANY proc is impure -> event is impure

const std = @import("std");

// Event with single pure implementation -> pure event
~event pure_add { x: i32, y: i32 }
| done { result: i32 }

~[pure]proc pure_add {
    return .{ .done = .{ .result = x + y } };
}

// Event with single impure implementation -> impure event
~event impure_log { msg: []const u8 }
| done {}

~proc impure_log {
    std.debug.print("[LOG] {s}\n", .{msg});
    return .{ .done = .{} };
}

// Use both events
~event compute { a: i32, b: i32 }
| done { result: i32 }

~proc compute {
    const sum = pure_add_event.handler(.{ .x = a, .y = b });

    switch (sum) {
        .done => |d| {
            _ = impure_log_event.handler(.{ .msg = "Computed!" });
            return .{ .done = .{ .result = d.result } };
        },
    }
}

~event print_number { n: i32 }
| done {}

~proc print_number {
    std.debug.print("Result: {}\n", .{n});
    return .{ .done = .{} };
}

~event main {}
| done {}

~proc main {
    const result = compute_event.handler(.{ .a = 20, .b = 22 });

    switch (result) {
        .done => |d| {
            _ = print_number_event.handler(.{ .n = d.result });
        },
    }

    return .{ .done = .{} };
}

~main()
| done |> _
input.kz

Expected Output

[LOG] Computed!
Result: 42

Test Configuration

MUST_RUN