sig
  module type S =
    sig
      module Id : Identifiable.S
      type directed_graph = Id.Set.t Id.Map.t
      type component = Has_loop of Id.t list | No_loop of Id.t
      val connected_components_sorted_from_roots_to_leaf :
        Strongly_connected_components.S.directed_graph ->
        Strongly_connected_components.S.component array
      val component_graph :
        Strongly_connected_components.S.directed_graph ->
        (Strongly_connected_components.S.component * int list) array
    end
  module Make :
    functor (Id : Identifiable.S->
      sig
        type directed_graph = Id.Set.t Id.Map.t
        type component = Has_loop of Id.t list | 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
      end
end