у меня есть цепь вычислений, которая изменяет состояние контекста:scalaz перерыв управления Free Монады и пауза для цепочки вычислений
case class Context(...)
type Step = (Context => Context)
val step1: Step = ctx => { ctx.copy(...) }
val step2: Step
val step3: Step
// ...
val stepN: Step
val chain = List(step1, step2, step3, ..., stepN).toStream
И я хотел бы ввести возвращаемое значение вычисления для управления потоком из этой цепи:
trait Cont
case class Break[Context](ctx: Context) extends Cont
case class Pause[Context](ctx: Context) extends Cont
case class Continue[Context](ctx: Context) extends Cont
Перерыв - означает отмену цепи после выполнения текущего шага,
Пауза - означает подвешивание вычисления на текущем этапе после его запуска, с возможностью возобновить следующий шаг позже (и проверить, если это возобновляемое?)
Продолжить - означает нормальное продолжение потока.
Каждый шаг должен возвращать текущее значение контекста, заключенного в Cont.
В настоящее время я делаю это, разворачивая поток шагов (цепочка val: поток [Cont [Step]]) и проверяя chain.isEmpty и chain.head, чтобы проверить, осталось ли какое-то вычисление.
Как это сделать, используя Free monads в scalaz?
большой подробный ответ, спасибо! – malikbakt