D
Size: a a a
D
AS
T => F[Unit]
AS
D
AS
D
AS
M
D
λ
λ
A
def handle[F[_]: Monad](
toDB: String => F[DBUnit],
toKafka: (DBToken, String) => F[KafkaUnit],
toLog: (KafkaUnit, String) => F[LogUnit]
): String => F[(DBUnit, KafkaUnit, LogUnit)] = { in =>
for {
dbUnit <- toDB(in)
kafkaUnit <- toKafka(dbUnit, in)
// can't catch this faulty call with types
_ <- toKafka(dbUnit, in)
logUnit <- toLog(kafkaUnit, in)
} yield (dbUnit, kafkaUnit, logUnit)
}
import cats._
import cats.data._
import cats.implicits._
case object WriteToDb
case object WriteToKafka
case object WriteToLog
case class DbToken(value: String) extends AnyVal
def handle[F[_]: Monad](
toDB: String => IndexedStateT[F, Unit, WriteToDb.type, DbToken],
toKafka: String => IndexedStateT[F, WriteToDb.type, WriteToKafka.type, Unit],
toLog: String => IndexedStateT[F, WriteToKafka.type, WriteToLog.type, Unit]
): String => F[Unit] = { in =>
(for {
token <- toDB(in)
_ <- toKafka(token.value)
// _ <- toKafka(token.value) // compile error
_ <- toLog(in)
} yield ()).runA(())
}
AS
M
λ
M
λ
λ
VC