DA
?
v = if (t = something1()), do: do_something1(v, t), else: v
v = if (t = something2()), do: do_something2(v, t), else: v
v = if (t = something3()), do: do_something3(v, t), else: v
Size: a a a
DA
?
v = if (t = something1()), do: do_something1(v, t), else: v
v = if (t = something2()), do: do_something2(v, t), else: v
v = if (t = something3()), do: do_something3(v, t), else: v
DA
q = from v in Something, …
q = if (limit = opts[:limit] || @default_limit), do: from(q, limit: ^limit), else: q
q = if (begin_at = opts[:begin_at]), do: from(t in q, where: t.at >= ^begin_at), else: q
q = if (end_at = opts[:end_at]), do: from(t in q, where: t.at < ^end_at), else: q
…
AA
IB
?
v = if (t = something1()), do: do_something1(v, t), else: v
v = if (t = something2()), do: do_something2(v, t), else: v
v = if (t = something3()), do: do_something3(v, t), else: v
def maybe_apply(value, nil, _applier), do: value
def maybe_apply(value, fn, applier) when function(fn, 0), do: maybe_apply (value, fn.(), applier)
def maybe_apply(value, check, applier) when not is_function(check) and is_function(applier, 2), do: applier.(value, check)
q = (from v in Something, …)
|> maybe_apply(opts[:limit] || @default_limit), &from(&1, limit: &2))
|> maybe_apply(opts[:begin_at], &from(t in &1, where: t.at >= ^&2))
|> maybe_apply(opts[:end_at], &from(t in &1, where: t.at < ^&2))
IB
from
так можно, но идея ясна, думаюDA
def maybe_apply(value, nil, _applier), do: value
def maybe_apply(value, fn, applier) when function(fn, 0), do: maybe_apply (value, fn.(), applier)
def maybe_apply(value, check, applier) when not is_function(check) and is_function(applier, 2), do: applier.(value, check)
q = (from v in Something, …)
|> maybe_apply(opts[:limit] || @default_limit), &from(&1, limit: &2))
|> maybe_apply(opts[:begin_at], &from(t in &1, where: t.at >= ^&2))
|> maybe_apply(opts[:end_at], &from(t in &1, where: t.at < ^&2))
Ecto.Query.where/3
).IB
Ecto.Query.where/3
).IB
DA
defmacro cond_pipe(value, condition, do: do_clause) do
quote do
if unquote(condition) do
unquote(value) |> unquote(do_clause)
else
unquote(value)
end
end
end
defmacro cond_do(value, name \\ :value, condition, do: do_clause) do
quote do
with unquote(Macro.var name, nil) <- unquote(value) do
if unquote(condition) do
unquote(do_clause)
else
unquote(value)
end
end
end
end
…
from(t in Something,
|> (cond_pipe lim = opts[:limit], do: limit ^lim)
|> (cond_pipe begin_at = opts[:begin_at] do where [t], t.at >= ^begin_at end)
|> (cond_pipe end_at = opts[:end_at] do where [t], t.at < ^end_at end)
|> (repo.all timeout: @query_timeout)
…
iex(abillix@raznix.vnix)3> 3
3
iex(abillix@raznix.vnix)4> v |> cond_do(value > 0, do: value-1)
2
iex(abillix@raznix.vnix)5> value
** (CompileError) iex:5: undefined function value/0
iex(abillix@raznix.vnix)5> v |> cond_do(:vv, vv > 0, do: vv - 1)
1
iex(abillix@raznix.vnix)6> vv
** (CompileError) iex:6: undefined function vv/0
iex(abillix@raznix.vnix)6> v |> cond_do(:vv, vv > 0, do: vv - 1)
0
iex(abillix@raznix.vnix)7> v |> cond_do(:vv, vv > 0, do: vv - 1)
0
D
defmacro cond_pipe(value, condition, do: do_clause) do
quote do
if unquote(condition) do
unquote(value) |> unquote(do_clause)
else
unquote(value)
end
end
end
defmacro cond_do(value, name \\ :value, condition, do: do_clause) do
quote do
with unquote(Macro.var name, nil) <- unquote(value) do
if unquote(condition) do
unquote(do_clause)
else
unquote(value)
end
end
end
end
…
from(t in Something,
|> (cond_pipe lim = opts[:limit], do: limit ^lim)
|> (cond_pipe begin_at = opts[:begin_at] do where [t], t.at >= ^begin_at end)
|> (cond_pipe end_at = opts[:end_at] do where [t], t.at < ^end_at end)
|> (repo.all timeout: @query_timeout)
…
iex(abillix@raznix.vnix)3> 3
3
iex(abillix@raznix.vnix)4> v |> cond_do(value > 0, do: value-1)
2
iex(abillix@raznix.vnix)5> value
** (CompileError) iex:5: undefined function value/0
iex(abillix@raznix.vnix)5> v |> cond_do(:vv, vv > 0, do: vv - 1)
1
iex(abillix@raznix.vnix)6> vv
** (CompileError) iex:6: undefined function vv/0
iex(abillix@raznix.vnix)6> v |> cond_do(:vv, vv > 0, do: vv - 1)
0
iex(abillix@raznix.vnix)7> v |> cond_do(:vv, vv > 0, do: vv - 1)
0
D
DA
D
DA
DA
v = if cond, do: …, else v
, я "спотыкаюсь" на нём, то, по сути, выхода тут только три: либо продолжать раз за разом "спотыкаться" (искренне матерясь), либо устранить причину вышеописанным способом, либо перестроить своё сознание, устранив из него причину "спотыкания".D
D
v = if cond, do: …, else v
, я "спотыкаюсь" на нём, то, по сути, выхода тут только три: либо продолжать раз за разом "спотыкаться" (искренне матерясь), либо устранить причину вышеописанным способом, либо перестроить своё сознание, устранив из него причину "спотыкания".S
D
q = from v in Something, …
q = if (limit = opts[:limit] || @default_limit), do: from(q, limit: ^limit), else: q
q = if (begin_at = opts[:begin_at]), do: from(t in q, where: t.at >= ^begin_at), else: q
q = if (end_at = opts[:end_at]), do: from(t in q, where: t.at < ^end_at), else: q
…
IB
q = from v in Something, …
q = if (limit = opts[:limit] || @default_limit), do: from(q, limit: ^limit), else: q
q = if (begin_at = opts[:begin_at]), do: from(t in q, where: t.at >= ^begin_at), else: q
q = if (end_at = opts[:end_at]), do: from(t in q, where: t.at < ^end_at), else: q
…