Workflow Composition
Route Request Workflow
Select Case
A request router can map an integer kind to a route label and adjusted cost.
Program
Play the program to choose a request kind and see the selected branch update the workflow state.
route_request_workflow.f90
Replay: real traced execution (multi-file project)
program route_request_workflow_demo
implicit none
integer :: request_kind
integer :: base_cost
integer :: adjusted_cost
character(len=8) :: route
request_kind = 2
base_cost = 40
select case (request_kind)
case (1)
route = 'fast'
adjusted_cost = base_cost - 5
case (2)
route = 'normal'
adjusted_cost = base_cost
case default
route = 'review'
adjusted_cost = base_cost + 20
end select
print '(A, 1X, I0)', trim(route), adjusted_cost
end program route_request_workflow_demo
program route_request_workflow_demo
implicit none
integer :: request_kind
integer :: base_cost
integer :: adjusted_cost
character(len=8) :: route
request_kind = 1
base_cost = 40
select case (request_kind)
case (1)
route = 'fast'
adjusted_cost = base_cost - 5
case (2)
route = 'normal'
adjusted_cost = base_cost
case default
route = 'review'
adjusted_cost = base_cost + 20
end select
print '(A, 1X, I0)', trim(route), adjusted_cost
end program route_request_workflow_demo
program route_request_workflow_demo
implicit none
integer :: request_kind
integer :: base_cost
integer :: adjusted_cost
character(len=8) :: route
request_kind = 3
base_cost = 40
select case (request_kind)
case (1)
route = 'fast'
adjusted_cost = base_cost - 5
case (2)
route = 'normal'
adjusted_cost = base_cost
case default
route = 'review'
adjusted_cost = base_cost + 20
end select
print '(A, 1X, I0)', trim(route), adjusted_cost
end program route_request_workflow_demo
request_kind ← 2
8request_kind = 29base_cost = 40values this step2request_kindbase_cost ← 40
8request_kind = 29base_cost = 4010select case (request_kind)values this step40base_costselect case (request_kind)
9base_cost = 4010select case (request_kind)11case (1)values this step2request_kindcase (2)
13 adjusted_cost = base_cost - 514case (2)15 route = 'normal'values this step2request_kindroute ← normal
14case (2)15 route = 'normal'16 adjusted_cost = base_costvalues this stepnormalrouteadjusted_cost ← 40
15 route = 'normal'16 adjusted_cost = base_cost17case defaultvalues this step40adjusted_cost40base_costprint '(A, 1X, I0)', trim(route), adjusted_cost
20 end select21 print '(A, 1X, I0)', trim(route), adjusted_cost22end program route_request_workflow_demooutputnormal 40values this stepnormalroute40adjusted_cost
request_kind ← 1
8request_kind = 19base_cost = 40values this step1request_kindbase_cost ← 40
8request_kind = 19base_cost = 4010select case (request_kind)values this step40base_costselect case (request_kind)
9base_cost = 4010select case (request_kind)11case (1)values this step1request_kindcase (1)
10select case (request_kind)11case (1)12 route = 'fast'values this step1request_kindroute ← fast
11case (1)12 route = 'fast'13 adjusted_cost = base_cost - 5values this stepfastrouteadjusted_cost ← 35
12 route = 'fast'13 adjusted_cost = base_cost - 514case (2)values this step35adjusted_cost40base_costprint '(A, 1X, I0)', trim(route), adjusted_cost
20 end select21 print '(A, 1X, I0)', trim(route), adjusted_cost22end program route_request_workflow_demooutputfast 35values this stepfastroute35adjusted_cost
request_kind ← 3
8request_kind = 39base_cost = 40values this step3request_kindbase_cost ← 40
8request_kind = 39base_cost = 4010select case (request_kind)values this step40base_costselect case (request_kind)
9base_cost = 4010select case (request_kind)11case (1)values this step3request_kindcase default
16 adjusted_cost = base_cost17case default18 route = 'review'values this step3request_kindroute ← review
17case default18 route = 'review'19 adjusted_cost = base_cost + 20values this stepreviewrouteadjusted_cost ← 60
18 route = 'review'19 adjusted_cost = base_cost + 2020end selectvalues this step60adjusted_cost40base_costprint '(A, 1X, I0)', trim(route), adjusted_cost
20 end select21 print '(A, 1X, I0)', trim(route), adjusted_cost22end program route_request_workflow_demooutputreview 60values this stepreviewroute60adjusted_cost
select case
`select case` chooses one route from several explicit cases.
case default
The default case handles request kinds not matched earlier.
workflow state
Both the label and the cost are updated by the selected branch.