/lab5

Make Hangman a GenServer

Primary LanguageElixir

We're going to turn the Hangman game into a GenServer.

This shouldn't involve any changes to lib/hangman/game.ex

However, we will have to change lib/hangman.ex. It will have exactly the same API as before, but it will pass messages to a GenServer instead of delegating directly to Hangman.Game.

The server will be in a new file: lib/hangman/server.ex. It will implement init/1 and the handle_call functions.

There's a subtlety here.

In the old API, Hangman.make_move returned {game, tally}.

In this new implementation, the representation of the game is just the pid of the GenServer, and the call to HangMan.make_move will have to add that pid back in to the return value in order to maintain the API. Thus, the lib/dictionary.ex module will containing

defmodule Hangman do

  def new_game() do
    Dictionary.start_link
    new_game(Dictionary.random_word)
  end

  def new_game(word) do
    { :ok, pid } = GenServer.start_link(Hangman.Server, [word])
    pid
  end

  def make_move(pid, guess) do
    result = GenServer.call(pid, {:make_move, guess})
    { pid, result }
  end
  
  def tally(pid) do
    GenServer.call(pid, {:tally})
  end

end