结合Future与Kleisli和Either在Finch端点上

时间:2017-12-19 01:19:14

标签: scala scala-cats finch

我和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#createOutput[Item]Future,因此Future[Reader[?]]之类的签名可以适用于ItemAction,但不确定是否可行和推荐。

关于此事的任何想法?

0 个答案:

没有答案