## Parameters

`module Id : sig ... end`

## Signature

`module Id = Id`
`type directed_graph = Id.Set.t Id.Map.t`

If (a -> set) belongs to the map, it means that there are edges from `a` to every element of `set`. It is assumed that no edge points to a vertex not represented in the map.

`type component =`

1. `| Has_loop of Id.t list`
2. `| No_loop of Id.t`

`val connected_components_sorted_from_roots_to_leaf : directed_graph -> component array`
`val component_graph : directed_graph -> (component * int list) array`