Current section

Files

Jump to
clean_mixer lib clean_mixer arch_graph.ex
Raw

lib/clean_mixer/arch_graph.ex

defmodule CleanMixer.ArchGraph do
alias CleanMixer.ArchMap
alias CleanMixer.ArchMap.Component
@type t :: :digraph.graph()
@type cycle :: list(Component.t())
@spec build_from(ArchMap.t()) :: t
def build_from(arch_map) do
graph = :digraph.new()
Enum.each(arch_map.components, &:digraph.add_vertex(graph, &1))
Enum.each(arch_map.dependencies, &:digraph.add_edge(graph, &1.source, &1.target))
graph
end
@spec cycles(t) :: list(cycle)
def cycles(graph) do
graph
|> :digraph.vertices()
|> Enum.map(&:digraph.get_cycle(graph, &1))
|> Enum.reject(&is_boolean/1)
end
end