✓
Passing This code compiles and runs correctly.
Code
~import app/data
~app/data:alloc()
| allocated a |> app/data:validate(d: a)
| validated v |> app/data:process(d: v)
| processed p |> app/data:finalize(d: p)
| done _ |> _
Imported Files
const std = @import("std");
const Data = struct { value: i32 };
~pub event alloc {}
| allocated *Data<owned>
~proc alloc|zig {
const allocator = std.heap.page_allocator;
const ptr = allocator.create(Data) catch unreachable;
ptr.* = Data{ .value = 42 };
return .{ .allocated = ptr };
}
~pub event borrow { other: *Data<owned> }
| borrowed *Data<borrowed>
~proc borrow|zig {
return .{ .borrowed = other };
}
// Chain of events that all preserve the same state variable M
~pub event validate { d: *Data<M'_> }
| validated *Data<M'_> // Preserves M
~proc validate|zig {
return .{ .validated = d };
}
~pub event process { d: *Data<M'_> }
| processed *Data<M'_> // Preserves M
~proc process|zig {
return .{ .processed = d };
}
~pub event finalize { d: *Data<M'_> }
| done *Data<M'_> // Preserves M
~proc finalize|zig {
return .{ .done = d };
}
// Chain of events that all preserve the same state variable M
~pub event validate { data: *Data<M'_> }
| validated *Data<M'_> // Preserves M
~proc validate|zig {
return .{ .validated = data };
}
~pub event process { data: *Data<M'_> }
| processed *Data<M'_> // Preserves M
~proc process|zig {
return .{ .processed = data };
}
~pub event finalize { data: *Data<M'_> }
| done *Data<M'_> // Preserves M
~proc finalize|zig {
return .{ .done = data };
}