Edited at

with以外の手段で{:ok, x}を何とかする方法

More than 3 years have passed since last update.


パイプラインで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


モナドは…?

(*´・ω) (ω・`*)ネー