let continue_w (r: running_w)
: state_w * output_event list =
match r with
(*No levels left, so go to the Waiting state *)
| ({p = p; ls = []; all_ls=all_ls}) ->
(Waiting_w({p = p; ls = []; all_ls=all_ls}), [])
(*Now we run at level lev*)
| ({p = p; ls = lev::tl; all_ls=all_ls}) ->
match (p lev) with
| Waiting rsw ->
(* We skip the level lev if (r.p lev) is a consumer state *)
(Running_w({p = p; ls = tl; all_ls=all_ls}), [])
| Running rsr ->
let (s2, oes2) = (continue rsr) in
let p' = (fun lev' -> if lev'=lev then s2
else p lev') in
let tl' = ( match s2 with
| Waiting _ -> tl
| Running _ -> lev::tl
) in
let oes' = (filter_outputs_one_level oes2 lev all_ls) in
(Running_w({p=p'; ls=tl'; all_ls=all_ls}), oes')