pub fn root_ids<'a>(
        &'a self,
        direction: DependencyDirection,
    ) -> impl Iterator<Item = FeatureId<'g>> + ExactSizeIterator + 'a {
        let dep_graph = self.graph.dep_graph();
        let package_graph = self.graph.package_graph;
        self.core
            .roots(dep_graph, self.graph.sccs(), direction)
            .into_iter()
            .map(move |feature_ix| FeatureId::from_node(package_graph, &dep_graph[feature_ix]))
    }
Returns the set of "root feature" IDs in the specified direction.

* If direction is Forward, return the set of feature IDs that do not have any dependencies
within the selected graph.
* If direction is Reverse, return the set of feature IDs that do not have any dependents
within the selected graph.

## Cycles

If a root consists of a dependency cycle, all the packages in it will be returned in
non-dev order (when the direction is forward).
guppy/src/graph/feature/resolve.rs