[back]

Filtering Rose Trees

type 'a rtree = Node of 'a * 'a rtree list

Implement the function

val filter_rtree : ('a -> bool) -> 'a rtree -> 'a rtree option

so that filter_rtree f t is the result of filtering out those values v of t for which f v = false. For a subtree Node (v, ts), if f v = false then the whole subtree should be removed. In particular, filter_rtree f (Node (v, ts)) is None if if f v = false.

let example : int rtree =
  Node
    ( 1
    , [ Node (2, [])
      ; Node (3, [Node (4, []); Node (5, [])])
      ; Node (6, [])
      ]
    )
let _ = assert
  (filter_rtree (fun x -> x <> 3) example
   = Some (Node (1, [Node (2, []); Node (6, [])])))
let _ = assert (filter_rtree (fun x -> x <> 1) example = None)