Skip to content

Commit

Permalink
Reorganize formula runtime.
Browse files Browse the repository at this point in the history
  • Loading branch information
Laimiux committed Jul 1, 2023
1 parent 8f00606 commit 36ee43c
Showing 1 changed file with 42 additions and 30 deletions.
72 changes: 42 additions & 30 deletions formula/src/main/java/com/instacart/formula/FormulaRuntime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,9 @@ class FormulaRuntime<Input : Any, Output : Any>(
if (initialization) {
manager = FormulaManagerImpl(this, implementation, input, inspector = inspector)
forceRun()
hasInitialFinished = true

lastOutput?.let {
onOutput(it)
}
hasInitialFinished = true
emitOutputIfNeeded(isInitialRun = true)
} else {
forceRun()
}
Expand All @@ -69,47 +67,49 @@ class FormulaRuntime<Input : Any, Output : Any>(
effectQueue.addLast(it)
}

run(shouldEvaluate = evaluate)
run(evaluate = evaluate)
}

private fun forceRun() = run(shouldEvaluate = true)
private fun forceRun() = run(evaluate = true)

/**
* Performs the evaluation and execution phases.
*
* @param shouldEvaluate Determines if evaluation needs to be run.
* @param evaluate Determines if evaluation needs to be run.
*/
private fun run(shouldEvaluate: Boolean) {
private fun run(evaluate: Boolean) {
try {
val freshRun = !isExecuting
if (freshRun) {
inspector?.onRunStarted(shouldEvaluate)
runFormula(evaluate)
if (!isExecuting) {
emitOutputIfNeeded(isInitialRun = false)
}
} catch (e: Throwable) {
manager?.markAsTerminated()
onError(e)
manager?.performTerminationSideEffects()
}
}

val manager = checkNotNull(manager)
val currentInput = checkNotNull(input)
private fun runFormula(evaluate: Boolean) {
val freshRun = !isExecuting
if (freshRun) {
inspector?.onRunStarted(evaluate)
}

if (shouldEvaluate && !manager.terminated) {
evaluationPhase(manager, currentInput)
}
val manager = checkNotNull(manager)
val currentInput = checkNotNull(input)

executionRequested = true
if (isExecuting) return
if (evaluate && !manager.terminated) {
evaluationPhase(manager, currentInput)
}

executionPhase(manager)
executionRequested = true
if (isExecuting) return

if (freshRun) {
inspector?.onRunFinished()
}
executionPhase(manager)

if (hasInitialFinished && emitOutput) {
emitOutput = false
onOutput(checkNotNull(lastOutput))
}
} catch (e: Throwable) {
manager?.markAsTerminated()
onError(e)
manager?.performTerminationSideEffects()
if (freshRun) {
inspector?.onRunFinished()
}
}

Expand Down Expand Up @@ -174,4 +174,16 @@ class FormulaRuntime<Input : Any, Output : Any>(
}
return false
}

/**
* Emits output to the formula subscriber.
*/
private fun emitOutputIfNeeded(isInitialRun: Boolean) {
if (isInitialRun) {
lastOutput?.let(onOutput)
} else if (hasInitialFinished && emitOutput) {
emitOutput = false
onOutput(checkNotNull(lastOutput))
}
}
}

0 comments on commit 36ee43c

Please sign in to comment.