lib/providers/hat.ex

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