Workflow Composition
Request Score Workflow
Call and Combine
A workflow can call an internal function, return a derived value, and combine it with local state.
Program
Play the program to choose a request count and watch the call contribute to the final score.
request_score_workflow.f90
Replay: real traced execution (multi-file project)
program request_score_workflow_demo
implicit none
integer :: request_count
integer :: base_points
integer :: bonus_points
integer :: total_points
request_count = 4
base_points = 10
bonus_points = score_bonus(request_count)
total_points = base_points + bonus_points
print '(I0, 1X, I0)', request_count, total_points
contains
function score_bonus(count) result(points)
integer, intent(in) :: count
integer :: points
points = count * 3
end function score_bonus
end program request_score_workflow_demo
program request_score_workflow_demo
implicit none
integer :: request_count
integer :: base_points
integer :: bonus_points
integer :: total_points
request_count = 2
base_points = 10
bonus_points = score_bonus(request_count)
total_points = base_points + bonus_points
print '(I0, 1X, I0)', request_count, total_points
contains
function score_bonus(count) result(points)
integer, intent(in) :: count
integer :: points
points = count * 3
end function score_bonus
end program request_score_workflow_demo
program request_score_workflow_demo
implicit none
integer :: request_count
integer :: base_points
integer :: bonus_points
integer :: total_points
request_count = 7
base_points = 10
bonus_points = score_bonus(request_count)
total_points = base_points + bonus_points
print '(I0, 1X, I0)', request_count, total_points
contains
function score_bonus(count) result(points)
integer, intent(in) :: count
integer :: points
points = count * 3
end function score_bonus
end program request_score_workflow_demo
request_count ← 4
8request_count = 49base_points = 10values this step4request_countbase_points ← 10
8request_count = 49base_points = 1010bonus_points = score_bonus(request_count)values this step10base_pointsbonus_points = score_bonus(request_count)
9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_pointsvalues this step4request_countpoints ← 12
17 integer :: points18 points = count * 319end function score_bonusvalues this step12points4countbonus_points ← 12
9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_pointsvalues this step12bonus_pointstotal_points ← 22
10bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_pointsvalues this step22total_points10base_points12bonus_pointsprint '(I0, 1X, I0)', request_count, total_points
11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_pointsoutput4 22values this step4request_count22total_points
request_count ← 2
8request_count = 29base_points = 10values this step2request_countbase_points ← 10
8request_count = 29base_points = 1010bonus_points = score_bonus(request_count)values this step10base_pointsbonus_points = score_bonus(request_count)
9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_pointsvalues this step2request_countpoints ← 6
17 integer :: points18 points = count * 319end function score_bonusvalues this step6points2countbonus_points ← 6
9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_pointsvalues this step6bonus_pointstotal_points ← 16
10bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_pointsvalues this step16total_points10base_points6bonus_pointsprint '(I0, 1X, I0)', request_count, total_points
11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_pointsoutput2 16values this step2request_count16total_points
request_count ← 7
8request_count = 79base_points = 10values this step7request_countbase_points ← 10
8request_count = 79base_points = 1010bonus_points = score_bonus(request_count)values this step10base_pointsbonus_points = score_bonus(request_count)
9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_pointsvalues this step7request_countpoints ← 21
17 integer :: points18 points = count * 319end function score_bonusvalues this step21points7countbonus_points ← 21
9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_pointsvalues this step21bonus_pointstotal_points ← 31
10bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_pointsvalues this step31total_points10base_points21bonus_pointsprint '(I0, 1X, I0)', request_count, total_points
11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_pointsoutput7 31values this step7request_count31total_points
internal function
`contains` lets the program define a local function used by the main workflow.
call step
`score_bonus(request_count)` jumps to the function and returns a value.
composition
The final total combines local state with the function result.