Как бы вы обернули класс, содержащий параллельную sh карту, с кошками? - PullRequest
3 голосов
/ 05 августа 2020

Скажем, у меня есть класс, содержащий внутреннюю конкурентную ha sh map

final class SomeClass() {
  private val byUserId = new ConcurrentHashMap[User.ID, Vector[User]](64)

  // ...
}

Теперь, если бы я хотел, чтобы этот класс упоминался в конечных точках API и других областях в моих сервисах, как бы я обернуть это в кошачий ввод-вывод / эффекты?

Так как это уже состояние управления, будет ли это все равно ввод-вывод эффектов? 1010 * в FP.

1 Ответ

2 голосов
/ 05 августа 2020

Думаю, это зависит от того, как вы собираетесь его использовать. Вот мои мысли по этому поводу.

Значит, вы, вероятно, хотите, чтобы один экземпляр этого класса (и одна карта) использовался совместно разными процессами, верно? Таким образом, его создание должно быть обернуто в IO. Затем вы можете внедрить его как зависимость во все другие места, где вам нужно его использовать. Тогда все методы publi c этого класса, которые имеют какое-либо отношение к Map, также должны возвращать IO.

final class SomeClass private() {
  private val byUserId = new ConcurrentHashMap[User.ID, Vector[User]](64)

  def getById(id: User.ID): IO[Vector[User]] = ???

  def setUser(id: User.ID, user: Vector[User]): IO[Unit] = ???
}

object SomeClass {
  def apply() = IO(new SomeClass())
}

SomeClass().flatMap { instance =>
  // do stuff with it
  Api(instance)
}
...