let iter_dnodes f d = let rec iter marked f d = if not (Sint.mem d.dn_id !marked) then ( (f d:unit) ; marked := Sint.add d.dn_id !marked ; List.iter (iter marked f) d.dn_source ) in iter (ref Sint.empty) f d