我想编写一个基本的 doobie 读/写事务,但关键是IO
中间有一个返回调用。我想做这样的事情:
abstract class MyDAO {
def readSomething(id: String): ConnectionIO[Option[Something]]
def writeSomething(something: Something): ConnectionIO[Unit]
}
class MyService {
def getNewSomething: IO[Something] = ???
}
class MyProgram(myDAO: MyDAO, myService: MyService, xa: DataSourceTransactor[IO]) {
val transaction = myDAO.readSomething("xyz").flatMap {
case Some(thing) => IO.pure(thing).pure[ConnectionIO] //ConnectionIO[IO[Something]]
case None => myService.getNewSomething.map { newSomething =>
myDAO.writeSomething(newSomething).map(_ => newSomething)
}.sequence[ConnectionIO, Something] //can't sequence an IO! So I'm stuck with IO[ConnectionIO[Something]]
}
transaction.transact(xa)
}
但我无法在IO
. 因此,在第二种情况下,我会被卡住,IO[ConnectionIO[Something]]
这意味着我的交易最终会像ConnectionIO[IO[ConnectionIO[Something]]
.
我想要的是一个ConnectionIO[IO[Something]]
我可以在单个事务中运行的结果,IO[IO[Something]]
然后我可以轻松地将其展平。(我不想运行IO
。)有意义吗?知道这是否有可能实现吗?