Skip to content

Instantly share code, notes, and snippets.

@costa
Last active September 1, 2018 12:32
Show Gist options
  • Select an option

  • Save costa/e2e68c3ce016ec203ac0ae51f724f499 to your computer and use it in GitHub Desktop.

Select an option

Save costa/e2e68c3ce016ec203ac0ae51f724f499 to your computer and use it in GitHub Desktop.
A (naive) implementation of (concurrent) prime sieve in Elixir, inspired by https://golang.org/doc/play/sieve.go
defmodule Prime do
defp create_prime_filter(prime, printer) do
send printer, prime
spawn fn -> filter_prime_rec prime, printer, nil end
end
defp filter_prime_rec(prime, printer, next) do
receive do
number ->
if rem(number, prime) != 0 do
if next do
send next, number
filter_prime_rec prime, nil, next
else
filter_prime_rec prime, nil, create_prime_filter(number, printer)
end
else
filter_prime_rec prime, printer, next
end
end
end
defp print_prime_rec do
receive do
prime -> IO.inspect prime
end
print_prime_rec()
end
defp run_rec(filter, number) do
send filter, number
run_rec filter, number + 1
end
def sieve do
run_rec create_prime_filter(2, spawn fn -> print_prime_rec() end), 3
end
end
Prime.sieve
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment