我和Finch和Cats有点混淆了。我最终遇到了一个问题,我的服务返回了一个存储库读者,并且返回Reader[Repository, Either[List[String], Entity]]
。
问题是:我需要以FP方式将Either的Right值转换为Finch的输出。因此,使用for-expr将无法工作,因为它将评估为新的Reader monad。
我看到一些使用fold作为either.fold[Output[Entity]](NotFound)(Ok)
之类的解决方案的实现 - 但我不确定它是否是我在Either和fold之间使用此Reader的有效路径。
Finch的Endpoint是一个未来,所以我想知道我是否将我的Reader monad封装在Future中,我可以将可能的最终评估转换为Finch的输出。
这是我现在得到的:
object ItemAction {
def routes: Endpoint[String] = post("todo" :: "items" :: jsonBody[Item]) { create _ }
def create(i: Item): Output[Item] = ???
}
object ItemService {
def create(item: Item): Reader[ItemRepository, Either[String, Item]] = Reader { (repository: ItemRepository) =>
repository.create(item)
}
}
所以,我的想法是在ItemService#create
上将Output[Item]
输出转换为ItemAction#create
。 Output[Item]
是Future
,因此Future[Reader[?]]
之类的签名可以适用于ItemAction
,但不确定是否可行和推荐。
关于此事的任何想法?