proc flow patterns

✓ Passing This code compiles and runs correctly.

Code

// ============================================================================
// VERIFIED REGRESSION TEST - DO NOT MODIFY WITHOUT DISCUSSION
// ============================================================================
// Test 210: All Proc Flow Patterns
// Demonstrates all three proc flow patterns working together
// ============================================================================

const std = @import("std");

~event simple { input: i32 }
| done { value: i32 }

~proc simple {
    return .{ .done = .{ .value = input } };
}

~event pattern1 { }
| result { value: i32 }

~event pattern2 { }
| result { value: i32 }

~event pattern3 { }
| result { value: i32 }

// Pattern 1: Proc as flow expression (~proc name = flow)
~proc pattern1 = simple(input: 42)
| done d |> result { value: d.value }

// Pattern 2: Terminal flow with implicit return
~proc pattern2 {
    // Last statement is flow without assignment → implicit return
    ~simple(input: 100)
    | done d |> result { value: d.value }
}

// Pattern 3: Assigned flow with explicit return (current behavior)
~proc pattern3 {
    const temp = ~simple(input: 200)
    | done d |> result { value: d.value }

    // Process the result further
    const final_value = temp.result.value + 1;
    return .{ .result = .{ .value = final_value } };
}

~event run_test { }
| done { }

~proc run_test {
    // Test pattern 1
    const r1 = ~pattern1()
    | result r |> result { value: r.value }
    std.debug.assert(r1.result.value == 42);
    std.debug.print("✅ Pattern 1 (proc as expression): {}\n", .{r1.result.value});

    // Test pattern 2
    const r2 = ~pattern2()
    | result r |> result { value: r.value }
    std.debug.assert(r2.result.value == 100);
    std.debug.print("✅ Pattern 2 (implicit return): {}\n", .{r2.result.value});

    // Test pattern 3
    const r3 = ~pattern3()
    | result r |> result { value: r.value }
    std.debug.assert(r3.result.value == 201);
    std.debug.print("✅ Pattern 3 (explicit return): {}\n", .{r3.result.value});

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

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

Expected Output

✅ Pattern 1 (proc as expression): 42
✅ Pattern 2 (implicit return): 100
✅ Pattern 3 (explicit return): 201

Test Configuration

MUST_RUN