lib/hologram/compiler/call_graph.ex

# DEFER: refactor & test

defmodule Hologram.Compiler.CallGraph do
  use Agent

  def add_edge(from_vertex, to_vertex) do
    Agent.update(__MODULE__, &Graph.add_edge(&1, from_vertex, to_vertex))
  end

  def add_vertex(vertex) do
    Agent.update(__MODULE__, &Graph.add_vertex(&1, vertex))
  end

  def create do
    start_link(nil)
  end

  def destroy do
    Process.whereis(__MODULE__) |> Process.exit(:normal)
  end

  def get do
    Agent.get(__MODULE__, & &1)
  end

  def has_edge?(from_vertex, to_vertex) do
    callback = fn call_graph ->
      edges = Graph.edges(call_graph, from_vertex, to_vertex)
      Enum.count(edges) == 1
    end

    Agent.get(__MODULE__, callback)
  end

  def has_vertex?(vertex) do
    Agent.get(__MODULE__, &Graph.has_vertex?(&1, vertex))
  end

  def num_edges do
    Agent.get(__MODULE__, &Graph.num_edges/1)
  end

  def num_vertices do
    Agent.get(__MODULE__, &Graph.num_vertices/1)
  end

  def reachable(vertices) do
    Agent.get(__MODULE__, &Graph.reachable(&1, vertices))
  end

  def start_link(_) do
    Agent.start_link(fn -> Graph.new() end, name: __MODULE__)
  end
end