defmodule Geospatial.Providers.Hat do @moduledoc """ Hat backend. """ alias Geospatial.Address alias Geospatial.Providers.Addok alias Geospatial.Providers.Nominatim alias Geospatial.Providers.Provider require Logger use Provider @behaviour Provider @impl Provider @doc """ Hat implementation for `c:Geospatial.Providers.Provider.geocode/3`. """ @spec geocode(String.t(), keyword()) :: list(Address.t()) def geocode(lon, lat, options \\ []) do tasks = [ Task.async(fn -> Addok.geocode(lon, lat, options) end), Task.async(fn -> Nominatim.geocode(lon, lat, options) end) ] [addrlist1, addrlist2] = Task.await_many(tasks, 12_000) addrlist2 ++ addrlist1 end @impl Provider @doc """ Hat implementation for `c:Geospatial.Providers.Provider.search/2`. """ @spec search(String.t(), keyword()) :: list(Address.t()) def search(q, options \\ []) do tasks = [ Task.async(fn -> Addok.search(q, options) end), Task.async(fn -> Nominatim.search(q, options) end) ] [addrlist1, addrlist2] = Task.await_many(tasks, 12_000) addrlist2 ++ addrlist1 end end