Есть ли в Scala элегантный способ определения асинхронного API на основе синхронного? - PullRequest
0 голосов
/ 11 декабря 2018

Я подозреваю, что ответ НЕТ, но подумал, что все равно спрошу.

Учитывая что-то вроде

trait foo {
  def sum(a: Int, b: Int): Int
}

Есть ли какая-то магия Скалы, которую я могу сделать, чтобы создать или неявно определить

trait fooAsync {
  def sum(a: Int, b: Int): Future[Int]
}

или мне просто нужно его грубо форсировать и явно определять fooAsync?Помогут ли макросы Scala?

1 Ответ

0 голосов
/ 12 декабря 2018

Если синхронный API определен вами, вы можете написать следующее:

trait Foo {
  type Response[A]

  def sum(a: Int, b: Int): Response[Int]
  def diff(a: Int, b: Int): Response[Int]
  /* ... */
}

trait SyncFoo extends Foo {
  type Response[A] = A
}

trait AsyncFoo extends Foo {
  type Response[A] = Future[A]
}

Если вам не нужен асинхронный интерфейс, вы можете просто обернуть все вызовы вашего синхронного API в Future { ... }.

...