Skip to content

Instantly share code, notes, and snippets.

@bbhoss
Last active October 25, 2015 02:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bbhoss/448ff498de7021f37b9c to your computer and use it in GitHub Desktop.
Save bbhoss/448ff498de7021f37b9c to your computer and use it in GitHub Desktop.
defmodule TicketBuyer do
use GenServer
@ticket_sites [:ticketscalper, :feemaster, :concertoverhead]
def start_link do
GenServer.start_link __MODULE__, []
end
def init(_args) do
{:ok, %{}}
end
def fetch_average_price(server, ticket_id) do
GenServer.call(server, {:fetch_ticket_prices, ticket_id}
end
def handle_call({:fetch_average_price, ticket_id}, from, state) do
for site <- @ticket_sites, do: fetch_price(site, ticket_id)
new_state = Map.put(state, ticket_id, %{from: from, responses: []})
{:noreply, new_state}
end
def handle_info({:ticket_client_response, site, ticket_id, price}, state) do
new_ticket_state = %{Map.get(state, ticket_id) | responses: [price | ticket_state.responses}
if length(new_ticket_state.responses) == length(@ticket_sites) do
average_price = Enum.sum(new_ticket_state.responses) / Enum.count(new_ticket_state.responses)
GenServer.reply(new_ticket_state.from, {:ok, average_price})
{:noreply, Map.drop(state, [ticket_id])}
else
{:noreply, Map.put(state, ticket_id, new_ticket_state)}
end
end
defp fetch_price(site, ticket_id) do
# Fetch URL or otherwise asyncronously request data here
TicketClient.request_price(site, ticket_id)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment