Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Future experiments from Elixir meetup
defmodule Future do
def new(fun) do
fn(x) ->
spawn_link fn ->
value = try do
{ :ok, fun.(x) }
rescue
e -> { :error, e }
end
receive do
pid ->
pid <- {self, value}
end
end
end
end
def value(pid, timeout // :infinity, default // {:error, :timeout}) do
pid <- self
receive do
{^pid, {:ok, value}} -> value
{^pid, {:error, e}} -> raise e
after
timeout -> default
end
end
end
defmodule Parallel do
def pmap(collection, fun) do
collection
|> Enum.map(Future.new(fun))
|> Enum.map(Future.value(&1, 1000, {:error}))
end
end
IO.inspect Parallel.pmap([1,2,3,4], fn x -> :timer.sleep(1000); x+1 end)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.