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.

request_kind
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
  1. request_kind ← 2

    8request_kind = 29base_cost = 40
    values this step2request_kind
  2. base_cost ← 40

    8request_kind = 29base_cost = 4010select case (request_kind)
    values this step40base_cost
  3. select case (request_kind)

    9base_cost = 4010select case (request_kind)11case (1)
    values this step2request_kind
  4. case (2)

    13    adjusted_cost = base_cost - 514case (2)15    route = 'normal'
    values this step2request_kind
  5. route ← normal

    14case (2)15    route = 'normal'16    adjusted_cost = base_cost
    values this stepnormalroute
  6. adjusted_cost ← 40

    15    route = 'normal'16    adjusted_cost = base_cost17case default
    values this step40adjusted_cost40base_cost
  7. print '(A, 1X, I0)', trim(route), adjusted_cost

    20    end select21    print '(A, 1X, I0)', trim(route), adjusted_cost22end program route_request_workflow_demo
    outputnormal 40
    values this stepnormalroute40adjusted_cost
  1. request_kind ← 1

    8request_kind = 19base_cost = 40
    values this step1request_kind
  2. base_cost ← 40

    8request_kind = 19base_cost = 4010select case (request_kind)
    values this step40base_cost
  3. select case (request_kind)

    9base_cost = 4010select case (request_kind)11case (1)
    values this step1request_kind
  4. case (1)

    10select case (request_kind)11case (1)12    route = 'fast'
    values this step1request_kind
  5. route ← fast

    11case (1)12    route = 'fast'13    adjusted_cost = base_cost - 5
    values this stepfastroute
  6. adjusted_cost ← 35

    12    route = 'fast'13    adjusted_cost = base_cost - 514case (2)
    values this step35adjusted_cost40base_cost
  7. print '(A, 1X, I0)', trim(route), adjusted_cost

    20    end select21    print '(A, 1X, I0)', trim(route), adjusted_cost22end program route_request_workflow_demo
    outputfast 35
    values this stepfastroute35adjusted_cost
  1. request_kind ← 3

    8request_kind = 39base_cost = 40
    values this step3request_kind
  2. base_cost ← 40

    8request_kind = 39base_cost = 4010select case (request_kind)
    values this step40base_cost
  3. select case (request_kind)

    9base_cost = 4010select case (request_kind)11case (1)
    values this step3request_kind
  4. case default

    16    adjusted_cost = base_cost17case default18    route = 'review'
    values this step3request_kind
  5. route ← review

    17case default18    route = 'review'19    adjusted_cost = base_cost + 20
    values this stepreviewroute
  6. adjusted_cost ← 60

    18    route = 'review'19    adjusted_cost = base_cost + 2020end select
    values this step60adjusted_cost40base_cost
  7. print '(A, 1X, I0)', trim(route), adjusted_cost

    20    end select21    print '(A, 1X, I0)', trim(route), adjusted_cost22end program route_request_workflow_demo
    outputreview 60
    values 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.