Back to Fpinscala

02.Answer

answerkey/iomonad/02.answer.md

latest362 B
Original Source
scala
extension [A](fa: Free[Function0, A])
  @annotation.tailrec
  def runTrampoline: A = fa match
    case Return(a) => a
    case Suspend(ta) => ta()
    case FlatMap(fx, f) => fx match
      case Return(x) => f(x).runTrampoline
      case Suspend(tx) => f(tx()).runTrampoline
      case FlatMap(fy, g) => fy.flatMap(y => g(y).flatMap(f)).runTrampoline