Прежде всего, если вы разрабатываете чисто функциональную программу, вы не можете вернуть Unit
(ни Future[Unit]
, потому что Future
не подавляет побочные эффекты).
Если производительность не является проблемой, я бы использовал Kleisli[Option, xType, IO[Unit]]
, где T = Option
. Итак, первое, что вам нужно сделать, это определить (добавить соответствующие типы)
def updated(oldX, x): Kleisli[Option, xType, xType] = Kleisli liftF {
if(x != oldX) None
else Some(x)
}
def doStuff(x, y): Kleisli[Option, xType, IO[Unit]] = Kleisli pure {
IO{
//doStuff
}
}
и теперь вы можете составить их для понимания чего-то подобного:
val result: Kleisli[Option, xType, IO[Unit]] = for{
xx <- updated(oldX, x)
effect <- doStuff(xx, y)
} yield effect
Вы можете выполнять вычисление с учетом состояния с помощью ReaderWriterStateT
, поэтому вы сохраняете oldX
как состояние.