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')