#![feature(adt_const_params, unsized_const_params)]
#![allow(incomplete_features)]
use std::marker::PhantomData;
use wasm4pm_compat::eventlog::{Event, EventLog, Trace};
use wasm4pm_compat::process_cube::{CubeDimension, CubeSlice, ProcessCube};
fn slice<const DIM_NAME: &'static str>(
_dimension: CubeDimension<DIM_NAME>,
log: &EventLog,
value: &str,
) -> EventLog {
let mut filtered_traces = Vec::new();
for trace in log.traces() {
let filtered_events: Vec<_> = trace
.events()
.iter()
.filter(|e| match DIM_NAME {
"resource" => e.resource() == Some(value),
"activity" => e.activity() == value,
_ => false, })
.cloned()
.collect();
if !filtered_events.is_empty() {
filtered_traces.push(Trace::new(trace.case_id(), filtered_events));
}
}
EventLog::from_traces(filtered_traces)
}
fn main() {
println!("== wasm4pm-compat: Rough Process Cube Slicing ==");
let log = EventLog::from_traces([
Trace::new(
"case-1",
[
Event::new("order").by("alice"),
Event::new("pay").by("bob"),
Event::new("ship").by("alice"),
],
),
Trace::new(
"case-2",
[
Event::new("order").by("alice"),
Event::new("cancel").by("alice"),
],
),
Trace::new(
"case-3",
[Event::new("order").by("bob"), Event::new("pay").by("bob")],
),
]);
println!(
"Original log: {} traces, {} events",
log.trace_count(),
log.event_count()
);
println!("\nSlicing by resource='alice'...");
let alice_log = slice(CubeDimension::<"resource">, &log, "alice");
println!(
"Alice sub-log: {} traces, {} events",
alice_log.trace_count(),
alice_log.event_count()
);
println!("\nSlicing by activity='pay'...");
let pay_log = slice(CubeDimension::<"activity">, &log, "pay");
println!(
"Pay sub-log: {} traces, {} events",
pay_log.trace_count(),
pay_log.event_count()
);
// 3. Organize using ProcessCube and CubeSlice shapes
// A ProcessCube declared over 2 dimensions (resource and activity).
let _cube: ProcessCube<EventLog, 2> = ProcessCube::new();
// A CubeSlice represents the binding of a dimension to a value.
let alice_slice: CubeSlice<CubeDimension<"resource">, &str> = CubeSlice {
dimension: PhantomData,
value: "alice",
};
println!("\nOrganized Slice metadata:");
println!(" Dimension : resource");
println!(" Value : {}", alice_slice.value);
println!(" Sub-log : {} events", alice_log.event_count());
// 4. Demonstrate "rough" cell intersection (resource='alice' AND activity='order')
println!("\nIntersecting resource='alice' and activity='order'...");
let order_log = slice(CubeDimension::<"activity">, &log, "order");
let alice_order_log = slice(CubeDimension::<"resource">, &order_log, "alice");
println!(
"Cell (alice, order): {} traces, {} events",
alice_order_log.trace_count(),
alice_order_log.event_count()
);
println!("\n(Slicing computation graduates to wasm4pm; these shapes organize the results)");
}