Current section
Files
Jump to
Current section
Files
lib/ex_rlp/decode/result.ex
defmodule ExRLP.Decode.Result do
@moduledoc false
defstruct acc: nil, result: nil
def add_item(result = %__MODULE__{acc: nil}, item) do
new_acc = item
%{result | acc: new_acc}
end
def add_item(result = %__MODULE__{acc: acc}, item) when is_list(acc) do
new_acc = [item | result.acc]
%{result | acc: new_acc}
end
def add_item(result = %__MODULE__{acc: acc}, item) do
new_acc = [item, acc]
%{result | acc: new_acc}
end
def add_result_item(result_struct = %__MODULE__{result: nil}, item) do
new_result = item
%{result_struct | result: new_result}
end
def add_result_item(result_struct = %__MODULE__{result: result}, item) when is_list(result) do
new_result = [item | result]
%{result_struct | result: new_result}
end
def add_result_item(result_struct = %__MODULE__{result: result}, item) do
new_result = [item, result]
%{result_struct | result: new_result}
end
def reverse(result = %__MODULE__{result: nil}) do
new_result = reverse_acc(result.acc)
%{result | acc: [], result: new_result}
end
def reverse(result) do
reversed_acc = reverse_acc(result.acc)
new_result =
cond do
is_nil(result.result) ->
reversed_acc
is_nil(reversed_acc) ->
result.result
is_list(result.result) && is_list(reversed_acc) ->
result.result ++ reversed_acc
is_list(result.result) ->
result.result ++ [reversed_acc]
is_list(reversed_acc) ->
[result] ++ reversed_acc
end
%{result | acc: [], result: new_result}
end
defp reverse_acc(acc) when is_list(acc) do
Enum.reverse(acc)
end
defp reverse_acc(acc), do: acc
end