package recursion object MutualTailCalls { fun recursiveCall(nextCall: () -> MutualTailCall) = object : MutualTailCall { override fun apply() = nextCall() } fun terminalValue(value: T) = object : MutualTailCall { override fun isTerminal() = true override fun result() = value override fun apply() = throw UnsupportedOperationException() } }