A traffic light cycles through a fixed set of states.

cycle A cycle returns to the first state after the final state.
transition The transition helper keeps the next-state rule separate from the loop.

Traffic Light

ticks
traffic_light.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

enum LightState {
    LIGHT_RED,
    LIGHT_GREEN,
    LIGHT_YELLOW
};

enum LightState nextLight(enum LightState state) {
    if (state == LIGHT_RED) {
        return LIGHT_GREEN;
    }
    if (state == LIGHT_GREEN) {
        return LIGHT_YELLOW;
    }
    return LIGHT_RED;
}

int main(void) {
    int ticks = 2;
    enum LightState state = LIGHT_RED;

    for (int i = 0; i < ticks; i++) {
        state = nextLight(state);
    }

    printf("ticks=%d light=%d\n", ticks, state);
    return 0;
}
#include <stdio.h>

enum LightState {
    LIGHT_RED,
    LIGHT_GREEN,
    LIGHT_YELLOW
};

enum LightState nextLight(enum LightState state) {
    if (state == LIGHT_RED) {
        return LIGHT_GREEN;
    }
    if (state == LIGHT_GREEN) {
        return LIGHT_YELLOW;
    }
    return LIGHT_RED;
}

int main(void) {
    int ticks = 1;
    enum LightState state = LIGHT_RED;

    for (int i = 0; i < ticks; i++) {
        state = nextLight(state);
    }

    printf("ticks=%d light=%d\n", ticks, state);
    return 0;
}
#include <stdio.h>

enum LightState {
    LIGHT_RED,
    LIGHT_GREEN,
    LIGHT_YELLOW
};

enum LightState nextLight(enum LightState state) {
    if (state == LIGHT_RED) {
        return LIGHT_GREEN;
    }
    if (state == LIGHT_GREEN) {
        return LIGHT_YELLOW;
    }
    return LIGHT_RED;
}

int main(void) {
    int ticks = 5;
    enum LightState state = LIGHT_RED;

    for (int i = 0; i < ticks; i++) {
        state = nextLight(state);
    }

    printf("ticks=%d light=%d\n", ticks, state);
    return 0;
}
  1. ticks ← 2

    19int main(void) {20    int ticks→ 2 = 2; //@ticks=1, 521    enum LightState state = LIGHT_RED;
  2. for (int i = 0; i < ticks; i++)

    pass 1 of 2
    23for (int i0 = 0; i < ticks2; i++) {24    state0 = nextLight(state);25}
  3. enum LightState nextLight(enum LightState state)

    pass 1 of 2
    9enum LightState nextLight(enum LightState state0) {10    if (state == LIGHT_RED) {
  4. if (state == LIGHT_RED)

    9enum LightState nextLight(enum LightState state) {10    if (state0 == LIGHT_RED0) {11        return LIGHT_GREEN1;12    }
  5. state ← 1

    23for (int i = 0; i < ticks; i++) {24    state→ 1 = nextLight(state);25}
  6. for (int i = 0; i < ticks; i++)

    pass 2 of 2
    23for (int i1 = 0; i < ticks2; i++) {24    state1 = nextLight(state);25}
  7. enum LightState nextLight(enum LightState state)

    pass 2 of 2
    9enum LightState nextLight(enum LightState state1) {10    if (state == LIGHT_RED) {
  8. if (state == LIGHT_GREEN)

    12}13if (state1 == LIGHT_GREEN1) {14    return LIGHT_YELLOW2;15}
  9. state ← 2

    23for (int i = 0; i < ticks; i++) {24    state→ 2 = nextLight(state);25}
  10. printf("ticks=%d light=%d ", ticks, state);

    27    printf("ticks=%d light=%d\n", ticks2, state2);28    return 0;29}
    outputticks=2 light=2
  1. ticks ← 1

    19int main(void) {20    int ticks→ 1 = 1;21    enum LightState state = LIGHT_RED;
  2. for (int i = 0; i < ticks; i++)

    23for (int i0 = 0; i < ticks1; i++) {24    state0 = nextLight(state);25}
  3. enum LightState nextLight(enum LightState state)

    9enum LightState nextLight(enum LightState state0) {10    if (state == LIGHT_RED) {
  4. if (state == LIGHT_RED)

    9enum LightState nextLight(enum LightState state) {10    if (state0 == LIGHT_RED0) {11        return LIGHT_GREEN1;12    }
  5. state ← 1

    23for (int i = 0; i < ticks; i++) {24    state→ 1 = nextLight(state);25}
  6. printf("ticks=%d light=%d ", ticks, state);

    27    printf("ticks=%d light=%d\n", ticks1, state1);28    return 0;29}
    outputticks=1 light=1
  1. ticks ← 5

    19int main(void) {20    int ticks→ 5 = 5;21    enum LightState state = LIGHT_RED;
  2. for (int i = 0; i < ticks; i++)

    pass 1 of 5
    23for (int i0 = 0; i < ticks5; i++) {24    state0 = nextLight(state);25}
    All 5 passes — pass 1 is the card above
    passistateLIGHT_REDLIGHT_GREENLIGHT_YELLOW
    10001
    21112
    322
    43001
    54112
  3. enum LightState nextLight(enum LightState state)

    pass 1 of 5
    9enum LightState nextLight(enum LightState state0) {10    if (state == LIGHT_RED) {
    All 5 passes — pass 1 is the card above
    passstateLIGHT_REDLIGHT_GREENLIGHT_YELLOW
    1001
    2112
    320
    4001
    5112
  4. if (state == LIGHT_RED)

    pass 1 of 2
    9enum LightState nextLight(enum LightState state) {10    if (state0 == LIGHT_RED0) {11        return LIGHT_GREEN1;12    }
  5. state ← 1

    23for (int i = 0; i < ticks; i++) {24    state→ 1 = nextLight(state);25}
  6. if (state == LIGHT_GREEN)

    pass 1 of 2
    12}13if (state1 == LIGHT_GREEN1) {14    return LIGHT_YELLOW2;15}
  7. state ← 2

    23for (int i = 0; i < ticks; i++) {24    state→ 2 = nextLight(state);25}
  8. state ← 0

    23for (int i = 0; i < ticks; i++) {24    state→ 0 = nextLight(state);25}
  9. if (state == LIGHT_RED)

    pass 2 of 2
    9enum LightState nextLight(enum LightState state) {10    if (state0 == LIGHT_RED0) {11        return LIGHT_GREEN1;12    }
  10. state ← 1

    23for (int i = 0; i < ticks; i++) {24    state→ 1 = nextLight(state);25}
  11. if (state == LIGHT_GREEN)

    pass 2 of 2
    12}13if (state1 == LIGHT_GREEN1) {14    return LIGHT_YELLOW2;15}
  12. state ← 2

    23for (int i = 0; i < ticks; i++) {24    state→ 2 = nextLight(state);25}
  13. printf("ticks=%d light=%d ", ticks, state);

    27    printf("ticks=%d light=%d\n", ticks5, state2);28    return 0;29}
    outputticks=5 light=2