diff --git a/go/TrafficLights/TrafficLight.go b/go/TrafficLights/TrafficLight.go index d0fb958..5256517 100644 --- a/go/TrafficLights/TrafficLight.go +++ b/go/TrafficLights/TrafficLight.go @@ -31,6 +31,22 @@ var Colours = []Colour{ red, green, yellow, } +func nextDirection(currentDirection CardinalDirection) CardinalDirection { + switch currentDirection { + case north: + return east + case south: + return west + case east: + return south + case west: + return north + default: + return north + } + +} + func nextColour(currentColour Colour) Colour { switch currentColour { case red: @@ -52,10 +68,10 @@ func main() { var eastColour = make(chan Colour, 2) var westColour = make(chan Colour, 2) - var northDirection = make(chan string, 4) - var southDirection = make(chan string, 4) - var eastDirection = make(chan string, 4) - var westDirection = make(chan string, 4) + var northDirection = make(chan string, 2) + var southDirection = make(chan string, 2) + var eastDirection = make(chan string, 2) + var westDirection = make(chan string, 2) go TrafficLight(north, northColour, southColour, northDirection, eastDirection, southDirection) go TrafficLight(south, southColour, northColour, southDirection, westDirection, northDirection) @@ -65,27 +81,59 @@ func main() { <-quitChannel } -func TrafficLight(direction CardinalDirection, currentColour <-chan Colour, oppositeColour chan<- Colour, currentDirection <-chan string, nextDirection chan<- string, oppositeDirection chan<- string) { +func TrafficLight(direction CardinalDirection, currentColour <-chan Colour, oppositeColour chan<- Colour, currentDirection <-chan string, nextDirectionChan chan<- string, oppositeDirection chan<- string) { var colour = red if direction != north && direction != south { - nextDirection <- "go" + nextDirectionChan <- string(nextDirection(direction)) + } for { show(direction, colour) - oppositeColour <- nextColour(colour) - select { - case msg := <-currentColour: - if msg == nextColour(colour) { - colour = msg - } + if colour == red { + syncLight(currentDirection, oppositeDirection) + changeDirection(direction, currentDirection, nextDirectionChan) } + colour = changeLight(colour, currentColour, oppositeColour) } } +func syncLight(currentDirection <-chan string, oppositeDirection chan<- string) { + oppositeDirection <- "sync" + select { + case msg := <-currentDirection: + if msg == "sync" { + return + + } + } +} + +func changeDirection(direction CardinalDirection, currentDirection <-chan string, nextDirectionChan chan<- string) { + nextDirectionChan <- string(nextDirection(direction)) + select { + case msg := <-currentDirection: + if msg == string(direction) { + return + } + } +} + +func changeLight(colour Colour, currentColour <-chan Colour, oppositeColour chan<- Colour) Colour { + oppositeColour <- nextColour(colour) + + select { + case msg := <-currentColour: + if msg == nextColour(colour) { + return nextColour(colour) + } + } + return colour +} + func show(direction CardinalDirection, colour Colour) { fmt.Println(string(direction), " : ", string(colour)) }