games.go 723 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package games
  2. type Games struct {
  3. addChan chan *Game
  4. listChan chan listChan
  5. }
  6. type listChan chan []*Game
  7. func New() Games {
  8. games := Games{
  9. addChan: make(chan *Game),
  10. listChan: make(chan listChan),
  11. }
  12. go serveGames(games)
  13. return games
  14. }
  15. func serveGames(games Games) {
  16. gamesMap := make(map[int64]*Game)
  17. for {
  18. select {
  19. case game := <-games.addChan:
  20. gamesMap[game.Id] = game
  21. case r := <-games.listChan:
  22. v := make([]*Game, 0, len(gamesMap))
  23. for _, value := range gamesMap {
  24. v = append(v, value)
  25. }
  26. r <- v
  27. }
  28. }
  29. }
  30. func (games Games) AddGame(game *Game) {
  31. games.addChan <- game
  32. }
  33. func (games Games) ListGames() []*Game {
  34. r := make(chan []*Game)
  35. games.listChan <- r
  36. return <-r
  37. }