Skip to content

Commit cdc11fa

Browse files
authored
Merge pull request #43 from artemeff/optimize-cast
optimize cast to move error_values option higher and update bench script to see reductions
2 parents 6beeb14 + 2ba15d4 commit cdc11fa

2 files changed

Lines changed: 11 additions & 8 deletions

File tree

bench/struct_bench.exs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ end
1919

2020
Benchee.run(
2121
%{
22-
"make" => fn -> {:ok, _} = Example.make(%{a: "test", b: 1.42, c: %{a: 0, b: 42}, d: %{e: "embeds"}}) end,
22+
"make" => fn ->
23+
{:ok, _} = Example.make(%{a: "test", b: 1.42, c: %{a: 0, b: 42}, d: %{e: "embeds"}})
24+
end,
2325
},
24-
time: 10,
25-
memory_time: 2
26+
time: 3,
27+
memory_time: 3,
28+
reduction_time: 3
2629
)

lib/construct/cast.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ defmodule Construct.Cast do
9999
params = convert_params(params)
100100
types = convert_types(types)
101101
permitted = Map.keys(types)
102+
error_values = Keyword.get(opts, :error_values, false)
102103

103-
case Enum.reduce(permitted, {%{}, %{}, true}, &process_param(&1, params, types, opts, &2)) do
104+
case Enum.reduce(permitted, {%{}, %{}, true}, &process_param(&1, params, types, error_values, opts, &2)) do
104105
{changes, _errors, true} -> {:ok, changes}
105106
{_changes, errors, false} -> {:error, errors}
106107
end
@@ -151,11 +152,11 @@ defmodule Construct.Cast do
151152
raise Construct.Error, "expected types to be a {key, value} structure, got: #{inspect(types)}"
152153
end
153154

154-
defp process_param(key, params, types, opts, {changes, errors, valid?}) do
155+
defp process_param(key, params, types, error_values, opts, {changes, errors, valid?}) do
155156
param_key = Atom.to_string(key)
156157
{type, type_opts} = type!(key, types)
157158

158-
case cast_field(param_key, type, type_opts, params, opts) do
159+
case cast_field(param_key, type, type_opts, params, error_values, opts) do
159160
{:ok, value} ->
160161
{Map.put(changes, key, value), errors, valid?}
161162

@@ -173,9 +174,8 @@ defmodule Construct.Cast do
173174
end
174175
end
175176

176-
defp cast_field(param_key, type, type_opts, params, opts) do
177+
defp cast_field(param_key, type, type_opts, params, error_values, opts) do
177178
default_value = Keyword.get(type_opts, :default, @default_value)
178-
error_values = Keyword.get(opts, :error_values, false)
179179

180180
case params do
181181
%{^param_key => value} when default_value != @default_value and value == default_value ->

0 commit comments

Comments
 (0)