UserRepository trait 有两种方法
isRegistered
和 insert
.
trait UserRepository[F[_]] {
def insert(user: domain.User): F[Long]
def isRegistered(user: domain.User): F[Boolean]
}
边界类是核心应用的边界。对于这个例子,它只有一个方法
register
,只有当它不存在时才创建一个新用户。
class Boundary[F[_]: Monad] private (userrepo: UserRepository[F]) {
def registerUser(user: User): F[Either[UserAlreadyRegistered, Long]] =
userrepo.isRegistered(user).flatMap {
case true =>
UserAlreadyRegistered(user).asLeft[Long].pure[F]
case false =>
for {
id <- userrepo.insert(user)
errorOrId = id.asRight[UserAlreadyRegistered]
} yield errorOrId
}
}
我的问题是有没有更简洁的方法来实现
registerUser
方法。我在项目中使用了cats core。