Hi I'm trying to understand and use the Reader Mo...
# arrow
j
Hi I'm trying to understand and use the Reader Monad, but i'm stuck trying to use it in a function This is my current function:
Copy code
fun authenticate(
    request: AuthenticateRequest,
    secretKey: SecretKey,
    con: Connection
): Either<ErrorMessage, Token>> = Either.fx {
    val (optUser) = getUserByUsername(con, request.username)
    val (user) = checkUserExists(optUser)
    val (_) = checkPassword(request.password, user)
    val (token) = generateToken(user, secretKey)
    token
}
In this case secretKey and Connection is dependencies From what I understand you can use the Reader monad to inject it from the top of the application:
Copy code
fun authenticate(request: AuthenticateRequest): Reader<Context, Either<ErrorMessage, Token>> {
    return ReaderApi.ask<Context>().map { ctx ->
        Either.fx {
            val (optUser) = getUserByUsername(ctx.sql2o, request.username)
            val (user) = checkUserExists(optUser)
            val (_) = checkPassword(request.password, user)
            val (token) = generateToken(user, ctx.secretKey)
            token
        }
    }
}
But this does not seem to compile
s
Hey Johan, I just checked your snippet and it compiles for me. I had to explicitly specify the types for
Either.fx
but I got a IDEA warning and compile error on that.
Copy code
import arrow.core.Either
import arrow.core.extensions.fx
import arrow.mtl.Reader
import arrow.mtl.ReaderApi
import arrow.mtl.map

object AuthenticateRequest
object Context
object ErrorMessage
object Token

fun authenticate(request: AuthenticateRequest): Reader<Context, Either<ErrorMessage, Token>> =
  ReaderApi.ask<Context>().map { ctx ->
    Either.fx<ErrorMessage, Token> {
      Token
    }
  }