[ Canada && no Quebec ]
[ vertical ]
[ Canada => no redAndYellowToGreen ]
[ Canada => no allWayFlashingRedAsStop ]
[ Canada => allWayYellow ]
[ leftArrow && no greenFlashing ]
[ no RightGreenArrow ]
[ no countdownTimer ]
TrafficLightSystem
Lamps
Red
Yellow
Green
LeftGreenArrow ?
RightGreenArrow ?
countdownTimer ?
[ no USA ]
redAndYellowToGreen ?
allWayFlashingRedAsStop ?
allWayYellow ?
[ no USA ]
or advancedOrExtendedLeft ?
greenFlashing
leftArrow
xor mountLocation
inFront
behind
xor orientation
vertical
horizontal
[ Europe => LeftGreenArrow && RightGreenArrow ]
[ Europe => redAndYellowToGreen ]
[ USA => allWayFlashingRedAsStop ]
[ Canada => advancedOrExtendedLeft ]
[ Europe => inFront ]
[ NorthAmerica => behind ]
[ Quebec => horizontal ]
xor Jurisdiction
Europe
UK ?
mux NorthAmerica
USA
Canada
Quebec ?
Australia
NewZealand
TrafficLight
red : Lamp
yellow : Lamp
green : Lamp
leftGreenArrow : Lamp ?
rightGreenArrow : Lamp ?
arrowsOff ?
[ arrowsOff <=> no leftGreenArrow.on && no leftGreenArrow.flashing ]
[ arrowsOff <=> no rightGreenArrow.on && no rightGreenArrow.flashing ]
emergencyVehicle ?
xor TrafficSignals
[ emergencyVehicle => if allWayYellow then some allYellow else some warning ]
proceed
[ red.off ]
[ yellow.off ]
[ green.on ]
prepareToStop
[ red.off ]
[ yellow.on ]
[ green.off ]
stop
[ red.on ]
[ yellow.off ]
[ green.off ]
warning
[ red.off ]
[ green.off ]
prepareToGo
[ red.on ]
[ yellow.on ]
[ green.off ]
allStop
[ yellow.off ]
[ green.off ]
allYellow
[ red.off ]
[ green.off ]
advancedLeft
[ red.on ]
[ yellow.off ]
extendedLeft
[ red.on ]
[ yellow.off ]
abstract xor Lamp
on
off
flashing