Current section
Files
Jump to
Current section
Files
lib/rondo/path.ex
defmodule Rondo.Path do
defstruct [path: [], parent: nil]
def create_root() do
%__MODULE__{path: []}
end
def create_child_path(parent, path) do
%__MODULE__{path: :lists.reverse(path), parent: parent}
end
def to_list(path), do: to_list(path, [])
defp to_list(%{parent: nil, path: path}, acc) do
[path | acc]
end
defp to_list(%{parent: parent, path: path}, acc) do
to_list(parent, [path | acc])
end
def from_list(path) do
path
|> from_list(nil)
end
defp from_list([], path) do
path
end
defp from_list([path | paths], parent) do
from_list(paths, %__MODULE__{parent: parent, path: path})
end
end
defimpl Inspect, for: Rondo.Path do
import Inspect.Algebra
def inspect(path, opts) do
concat(format_path(path, [">"], opts))
end
defp format_path(%{parent: nil, path: path}, acc, opts) do
["#Rondo.Path<", path_to_doc(path, opts) | acc]
end
defp format_path(%{parent: parent, path: path}, acc, opts) do
format_path(parent, [path_to_doc(path, opts) | acc], opts)
end
defp path_to_doc(path, opts) do
path
|> to_doc(opts)
end
end