Oℕ
Size: a a a
Oℕ
Oℕ
Oℕ
Oℕ
Oℕ
SA
processAuthReq[A](req: AuthRequest[A]): Result[A], где Result - GADT. Знания A почти наверняка не хватит, чтобы интерпретировать ResultOℕ
A. Но выглядит сложным, мне не приходит в голову задач, где такое абстрагирование окупилось бы. Возможно, нужно больше практики.sealed trait Token
case class SimpleToken(str: String) extends Token
case class JsonToken[A: Encoder](a: A) extends Token
Oℕ
Oℕ
𝛈µ
𝛈µ
𝛈µ
Oℕ
SA
sealed trait AuthRequest[A]
case class SimpleAuth(user: String, password: String) extends AuthRequest[(String, String)]
case class BearerAuth(token: String) extends AuthRequest[String]
case class ExternalAuth(provider: String, id: UUID) extends AuthRequest[ExtAuth]
def getAuthReqData[A](req: AuthRequest[A]): IO[A] = req match {
case SimpleAuth(user, password) => (user, password).pure[IO]
case BearerAuth(token) => token.pure[IO]
case ExternalAuth(provider, id) => getExtAuthFor(provider).getAuthData(id)
}
Oℕ
Oℕ
Oℕ
trait JsonToken extends Token{
type A
implicit def encoder: Encoder[A]
val a : A
}
но использовать её гораздо сложнееOℕ
Oℕ
sealed trait AuthRequest[A]
case class SimpleAuth[A](user: String, password: String, ev: A Is (String, String)) extends AuthRequest[A]
case class BearerAuth[A](token: String, ev: A Is String) extends AuthRequest[A]
case class ExternalAuth[A](provider: String, id: UUID, ev: A Is ExtAuth) extends AuthRequest[A]Oℕ
~ - ограничения, из которого компилятор мог бы получить равенство типов для унификации