パイプラインでok
with
を置き換えるのが目的ではありませんが、パイプラインの恩恵を得ながら{:ok, x}をどうにかしたいです。withの書き方はfor寄りでパイプラインの流れの中には馴染みません。awesome-elixirから幾つか抜粋すると
plumber_girl
ruby2elixir/plumber_girl
>>>
やok
で{:ok, x}を剥けます。
happy
vic/happy
case ~ do
で包んでくれるという物。ちょっと見慣れません…
happy_path do
{:ok, b} = a
c(b)
else
x -> x
end
gets rewritten to:
case(a) do
{:ok, b} ->
case (b) do
{:ok, d} -> c(d)
end
end
ok_jose
名前がw
vic/ok_jose
目的に対して直球です。
def dup(x), do: {:ok, x * 2}
def nop(x), do: {:error, x}
{:ok, 12} |> dup |> dup |> ok # => {:ok, 48}
{:ok, 24} |> nop |> dup |> ok # => {:error, 24}
tap
mgwidmann/elixir-pattern_tap
plumber_girl の物より汎用的。
defmodule Foo do
def get_stuff(input) do
input
|> Enum.map(&(to_string(&1)))
|> Foo.HardWorker.work
|> tap({:ok, r1} ~> r1) # tap({:ok, r1}, r1) is also a supported format
|> Enum.map(&(Foo.IntermediateResult.handle(&1)))
|> tap({:ok, r2} ~> r2) # tap({:ok, r2}, r2) is also a supported format
end
end
モナドは…?
(*´・ω) (ω・`*)ネー