Extract tracker into supervision tree.
This commit is contained in:
@@ -1,22 +1,27 @@
|
||||
defmodule Tracker do
|
||||
def start(modules) do
|
||||
total = modules
|
||||
|> Enum.flat_map(&(&1.all_koans))
|
||||
|> Enum.count
|
||||
alias __MODULE__
|
||||
|
||||
Agent.start_link(fn -> %{total: total,
|
||||
koans: MapSet.new(),
|
||||
visited_modules: MapSet.new()} end, name: __MODULE__)
|
||||
modules
|
||||
defstruct total: 0, koans: MapSet.new(), visited_modules: MapSet.new()
|
||||
|
||||
def start_link do
|
||||
Agent.start_link(fn -> %Tracker{} end, name: __MODULE__)
|
||||
end
|
||||
|
||||
defp get(), do: Agent.get(__MODULE__, &(&1))
|
||||
def set_total(modules) do
|
||||
total = modules
|
||||
|> Enum.flat_map(&(&1.all_koans))
|
||||
|> Enum.count
|
||||
|
||||
Agent.update(__MODULE__, fn _ -> %Tracker{total: total} end)
|
||||
end
|
||||
|
||||
def completed(module, koan) do
|
||||
Agent.update(__MODULE__, fn(%{koans: completed, visited_modules: modules} = all) ->
|
||||
%{ all | koans: MapSet.put(completed, koan),
|
||||
visited_modules: MapSet.put(modules, module)}
|
||||
end)
|
||||
Agent.update(__MODULE__, &mark_koan_completed(&1, module, koan))
|
||||
end
|
||||
|
||||
defp mark_koan_completed(state, module, koan) do
|
||||
%{state | koans: MapSet.put(state.koans, koan),
|
||||
visited_modules: MapSet.put(state.visited_modules, module)}
|
||||
end
|
||||
|
||||
def visited do
|
||||
@@ -28,14 +33,13 @@ defmodule Tracker do
|
||||
total == completed
|
||||
end
|
||||
|
||||
def summarize, do: get() |> summarize()
|
||||
defp summarize(%{total: total,
|
||||
koans: completed,
|
||||
visited_modules: modules}) do
|
||||
def summarize do
|
||||
state = Agent.get(__MODULE__, &(&1))
|
||||
|
||||
%{
|
||||
total: total,
|
||||
current: MapSet.size(completed),
|
||||
visited_modules: MapSet.to_list(modules)
|
||||
total: state.total,
|
||||
current: MapSet.size(state.koans),
|
||||
visited_modules: MapSet.to_list(state.visited_modules)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user