From 5993c42ad7fe9301dd5103a9b6d7692a7302124c Mon Sep 17 00:00:00 2001 From: Marten/Qqwy Date: Mon, 6 Sep 2021 09:46:37 +0200 Subject: [PATCH] Use Arrays.Protocol.empty in implementation of other functions. --- lib/arrays.ex | 2 +- lib/arrays/implementations/erlang_array.ex | 8 +------- lib/arrays/implementations/map_array.ex | 24 ++++++++-------------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/lib/arrays.ex b/lib/arrays.ex index 6faa136..e7f7055 100644 --- a/lib/arrays.ex +++ b/lib/arrays.ex @@ -299,7 +299,7 @@ contents = quote do ) options = Keyword.delete(options, :implementation) - impl_module.empty(options) + Module.concat(Arrays.Protocol, impl_module).empty(options) end defp default_array_implementation() do diff --git a/lib/arrays/implementations/erlang_array.ex b/lib/arrays/implementations/erlang_array.ex index f05c402..88e8d0d 100644 --- a/lib/arrays/implementations/erlang_array.ex +++ b/lib/arrays/implementations/erlang_array.ex @@ -18,12 +18,6 @@ defmodule Arrays.Implementations.ErlangArray do defstruct contents: :array.new([default: nil]) - @impl Arrays.Behaviour - def empty(options) do - contents = :array.new([default: nil] ++ options) - %ErlangArray{contents: contents} - end - @doc """ Create an `%ErlangArray{}`-struct from an `:array`-record. @@ -276,7 +270,7 @@ defmodule Arrays.Implementations.ErlangArray do @impl true def slice(array = %ErlangArray{}, start, amount) do - @for.build_slice(array, start, amount, @for.empty(default: :array.default(array.contents))) + @for.build_slice(array, start, amount, empty(default: :array.default(array.contents))) end @impl true diff --git a/lib/arrays/implementations/map_array.ex b/lib/arrays/implementations/map_array.ex index a7e3aa1..a401a2c 100644 --- a/lib/arrays/implementations/map_array.ex +++ b/lib/arrays/implementations/map_array.ex @@ -9,18 +9,6 @@ defmodule Arrays.Implementations.MapArray do defstruct contents: %{}, default: nil - @impl Arrays.Behaviour - def empty(options) do - default = Keyword.get(options, :default, nil) - size = Keyword.get(options, :size, 0) - %MapArray{contents: construct(default, size), default: default} - end - - defp construct(_default, 0), do: %{} - - defp construct(default, size) do - Enum.into(0..(size - 1), %{}, &{&1, default}) - end if Code.ensure_loaded?(FunLand.Mappable) do Module.eval_quoted(__MODULE__, @@ -209,7 +197,7 @@ defmodule Arrays.Implementations.MapArray do @impl true def resize(%MapArray{default: default}, 0) do - MapArray.empty(default: default) + empty(default: default) end def resize(array = %MapArray{contents: contents}, size) when map_size(contents) == size do @@ -250,14 +238,20 @@ defmodule Arrays.Implementations.MapArray do @impl true def slice(array = %MapArray{}, start, amount) do - @for.build_slice(array, start, amount, @for.empty(default: array.default)) + @for.build_slice(array, start, amount, empty(default: array.default)) end @impl true def empty(options) when is_list(options) do default = Keyword.get(options, :default, nil) size = Keyword.get(options, :size, 0) - %MapArray{contents: MapArray.construct(default, size), default: default} + %MapArray{contents: construct(default, size), default: default} + end + + defp construct(_default, 0), do: %{} + + defp construct(default, size) do + Enum.into(0..(size - 1), %{}, &{&1, default}) end end end