Packages
finitomata
0.29.0
0.41.0
0.40.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.30.3
0.30.2
0.30.1
0.30.0
0.29.10
0.29.9
0.29.8
0.29.7
0.29.6
0.29.5
0.29.4
0.29.3
0.29.2
0.29.1
0.29.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.4
0.26.3
0.26.2
0.26.1
0.26.0
0.25.0
0.24.4
0.24.3
0.24.2
0.24.1
0.24.0
0.23.7
0.23.6
0.23.5
0.23.4
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.0
0.15.1
0.15.0
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.1
0.1.0
The FSM implementation generated from PlantUML textual representation.
Current section
Files
Jump to
Current section
Files
lib/finitomata/mix.ex
defmodule Finitomata.Mix do
@moduledoc false
@spec app_name :: atom
def app_name, do: Keyword.fetch!(Mix.Project.config(), :app)
@spec load_app :: :ok
def load_app do
load_app_recursive(app_name())
load_compile_time_deps()
:ok
end
@spec app_modules(Application.app()) :: [module]
def app_modules(app),
# we're currently supporting only Elixir modules
do:
Enum.filter(
Application.spec(app, :modules) || [],
&String.starts_with?(Atom.to_string(&1), "Elixir.")
)
@spec manifest_path(String.t()) :: String.t()
def manifest_path(name),
do: Path.join(Mix.Project.manifest_path(Mix.Project.config()), "compile.#{name}")
@spec read_manifest(String.t()) :: term
def read_manifest(name) do
name |> manifest_path() |> File.read!() |> :erlang.binary_to_term()
rescue
_ -> nil
end
@spec write_manifest(String.t(), term) :: :ok
def write_manifest(name, data) do
path = manifest_path(name)
File.mkdir_p!(Path.dirname(path))
File.write!(path, :erlang.term_to_binary(data))
end
defp load_app_recursive(app_name, visited \\ MapSet.new()) do
if MapSet.member?(visited, app_name) do
visited
else
visited = MapSet.put(visited, app_name)
visited =
if Application.load(app_name) in [:ok, {:error, {:already_loaded, app_name}}] do
Application.spec(app_name, :applications)
|> Stream.concat(Application.spec(app_name, :included_applications))
|> Enum.reduce(visited, &load_app_recursive/2)
else
visited
end
visited
end
end
defp load_compile_time_deps do
Mix.Project.config()
|> Keyword.get(:deps, [])
|> Stream.filter(fn
spec ->
spec
|> Tuple.to_list()
|> Stream.filter(&is_list/1)
|> Enum.any?(&(Keyword.get(&1, :runtime) == false))
end)
|> Stream.map(fn spec -> elem(spec, 0) end)
|> Enum.each(&load_app_recursive/1)
end
end