Skip to content

Instantly share code, notes, and snippets.

@josephwilk
Created July 30, 2013 20:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save josephwilk/6116409 to your computer and use it in GitHub Desktop.
Save josephwilk/6116409 to your computer and use it in GitHub Desktop.
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