Skip to content

Commit

Permalink
Adds driver filters
Browse files Browse the repository at this point in the history
  • Loading branch information
joshnuss committed Dec 21, 2018
1 parent b4e1a9f commit 7cf1524
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 5 deletions.
9 changes: 8 additions & 1 deletion lib/xuber/cell.ex
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ defmodule XUber.Cell do
results =
state.pids
|> Enum.into([])
|> Enum.filter(fn {_pid, %{traits: traits}} -> filters -- traits == [] end)
|> Enum.filter(fn {_pid, %{traits: traits}} -> subset?(traits, filters) end)
|> Enum.map(fn {pid, %{position: to}} -> {pid, to, Geometry.distance(from, to)} end)
|> Enum.filter(fn {_pid, _position, distance} -> distance < radius end)

Expand All @@ -62,4 +62,11 @@ defmodule XUber.Cell do

%{state | pids: Map.delete(state.pids, pid)}
end

defp subset?(traits, filters) do
traits = MapSet.new(traits)
filters = MapSet.new(filters)

MapSet.subset?(traits, filters)
end
end
3 changes: 1 addition & 2 deletions lib/xuber/dispatcher.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,11 @@ defmodule XUber.Dispatcher do
end

defp find_driver(passenger, coordinates) do
nearest = Grid.nearby(coordinates, @search_radius)
nearest = Grid.nearby(coordinates, @search_radius, [:driver])

{driver, _position, _distance} =
nearest
|> Enum.filter(fn {pid, _position, _distance} -> pid !== passenger end)
# TODO: ensure it's an available driver
|> List.first()

{:ok, driver}
Expand Down
4 changes: 2 additions & 2 deletions lib/xuber/grid.ex
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ defmodule XUber.Grid do
def update(pid, last_position, new_position),
do: call(last_position, {:update, pid, new_position})

def nearby(coordinates, radius, options \\ []) do
def nearby(coordinates, radius, filters \\ []) do
coordinates
|> surrounding(radius)
|> Enum.map(&call(&1, {:nearby, coordinates, radius, options}))
|> Enum.map(&call(&1, {:nearby, coordinates, radius, filters}))
|> Enum.map(fn {:ok, response} -> response end)
|> List.flatten()
|> Enum.sort(fn {_, _, a}, {_, _, b} -> a >= b end)
Expand Down

0 comments on commit 7cf1524

Please sign in to comment.