Skip to content

Instantly share code, notes, and snippets.

@bbhoss
Last active October 25, 2015 02:23
Show Gist options
  • Select an option

  • Save bbhoss/448ff498de7021f37b9c to your computer and use it in GitHub Desktop.

Select an option

Save bbhoss/448ff498de7021f37b9c to your computer and use it in GitHub Desktop.

Revisions

  1. bbhoss revised this gist Oct 25, 2015. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion foo.ex
    Original file line number Diff line number Diff line change
    @@ -32,7 +32,7 @@ defmodule TicketBuyer do
    end

    defp fetch_price(site, ticket_id) do
    # Build URL or otherwise asyncronously request data here
    # Fetch URL or otherwise asyncronously request data here
    TicketClient.request_price(site, ticket_id)
    end
    end
  2. bbhoss revised this gist Oct 25, 2015. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion foo.ex
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,6 @@
    defmodule TicketBuyer do
    use GenServer
    @ticket_sites [:ticketscalper, :feemaster, :concertoverhead]
    @ticket_sites_number length(@ticket_sites)

    def start_link do
    GenServer.start_link __MODULE__, []
  3. bbhoss revised this gist Oct 25, 2015. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion foo.ex
    Original file line number Diff line number Diff line change
    @@ -21,7 +21,7 @@ defmodule TicketBuyer do
    {:noreply, new_state}
    end

    def handle_info({:http_client_response, site, ticket_id, price}, state) do
    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)
  4. bbhoss created this gist Oct 25, 2015.
    39 changes: 39 additions & 0 deletions foo.ex
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,39 @@
    defmodule TicketBuyer do
    use GenServer
    @ticket_sites [:ticketscalper, :feemaster, :concertoverhead]
    @ticket_sites_number length(@ticket_sites)

    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({:http_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
    # Build URL or otherwise asyncronously request data here
    TicketClient.request_price(site, ticket_id)
    end
    end