let receive_w (ie : input_event) (w: waiting_w)
: state_w * output_event list =
let lev = (label_input ie) in
let add_levs = (ro ie) in
let new_lev = (if List.mem lev w.all_ls then []
else [lev]) in
let new_add_levs = (find_new_levels w.all_ls (add_levs @ new_lev) []) in
let p' = (make_new_copies new_add_levs L w.p) in
let upper_list = (insert_levels (upper w.all_ls ie) new_add_levs) in
let all_ls = (insert_levels w.all_ls new_add_levs) in
let p'' = (update_pointers upper_list p' ie) in
let os = (get_output p' ie) in
let os'= (filter_outputs os lev new_add_levs) in
((Running_w({p=p''; ls=upper_list; all_ls=all_ls})), os')