let node_remove (dr: node_ref) (b: b)
  : b * output_event list =
    begin match node_parent dr b with
    | No_parent ->
        (b, [])
    | Page_parent(pr') ->
        let p = page_assoc_valid pr' b in
        let p' = { p with page_document = None } in
        let b' = page_update pr' p' b in
        (b', [ page_update_event pr' b' ])
    | Parent_node(p) ->
        begin match node_assoc_valid p b with
        | Div_node(id, children) ->
            let children' = List.filter (fun dr' -> dr' <> dr) children in
            let b' = node_update p (Div_node(id, children')) b in
            begin match node_page dr b with
            | None -> (b', [])
            | Some(pr') -> (b', [ page_update_event pr' b' ])
            end
        | _ -> assert false
        end
    end