R
Size: a a a
λ
ᛒ
Bud[Petal[F]] = F[Bud[Petal[F]]
За счёт двойной контравариантности мы получаем, что Bud ковариантен по Fsealed trait UserRepoT[ +E, +A]и потом типа оборачиваешь
case class ReadUser(userId: UserId) extends UserRepoT[UserNotFound, User]
case class WriteUser(user: User) extends UserRepoT[UserConflict, Unit]
type UserRepo = Petal.Simple[UserRepoT]
sealed trait KafkaPullT[+F[+_, +_], +E, +A]
case class AddConsumer[+F[+_, +_]](topic: Topic, handler: KafkaMessage => F[Nothing, Unit]) extends KafkaPullT[F, Nothing, Unit]
type KafkaPull = Petal[KafkaPullT]
def writeUser(user: User): Bud[UserRepo, UserConflict, Unit] = Bud(WriteUser(user))потом хуяк, юзаешь
def addConsumer[P <: Petal[Nothing]](topic: Topic, handler: KafkaMessage => Bud[P, Nothing, Unit]): Bud[P with KafkaPull] = Bud(AddConsumer(topic, handler)
for {и тип выводится автоматически как
k <- writeUser(oleg)
_ <- addConsumer(sugakTopic, eatHinkalee)
} yield
Bud[UserRepo with KafkaPull with Monadic]
ᛒ
V
KS
w
ᛒ
AS
ᛒ
KC
V
KC
AS
KS
D
KS