My first version of Ping-Pong in Elixir

Published on Author Akhil BansalLeave a comment

Recently I have started spending some of my time with Elixir and following Dave Thomas’ Programming Elixir. Though I am half way through with the book, and still don’t have a very good hold on the language. After reading about processes in Elixir, I thought to write something my own so I wrote a small ping-pong program

defmodule PingPong do
  import :timer
  @timer  500
  def ping(x) do
    receive do
      {pong_pid, n} when n <= x ->  IO.puts ("Ping #{n}")
                                        send pong_pid, { self, (n) }
                                        sleep @timer
                                        ping(x)
    end
  end

  def pong(x) do
    receive do
      {ping_pid, n} when n <= x -> IO.puts ("Pong #{n}")
                                        send ping_pid, {self, (n + 1) }
                                        pong(x)
    end
  end

  def run(n) do
    {ping_pid, _} = spawn_monitor(PingPong, :ping, [n])
    {pong_pid, _} = spawn_monitor(PingPong, :pong, [n])
    send ping_pid, {pong_pid, 1}

    receive do
      msg -> IO.puts "Message received: #{msg}"
    end
  end
end

PingPong.run(30)

I am pretty sure that there would be much scope of improvement, but this is what I could write as of now. Your comments/suggestions are welcome, kindly add them in comments

Leave a Reply

Your email address will not be published. Required fields are marked *