Думаю, это зависит от того, как вы собираетесь его использовать. Вот мои мысли по этому поводу.
Значит, вы, вероятно, хотите, чтобы один экземпляр этого класса (и одна карта) использовался совместно разными процессами, верно? Таким образом, его создание должно быть обернуто в 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)
}