games.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package games
  2. type Games struct {
  3. addChan chan *Game
  4. listChan chan listChan
  5. getChan chan getGame
  6. }
  7. type listChan chan []*Game
  8. type getGame struct {
  9. id int64
  10. returnChan chan *Game
  11. }
  12. func New() Games {
  13. games := Games{
  14. addChan: make(chan *Game),
  15. listChan: make(chan listChan),
  16. getChan: make(chan getGame),
  17. }
  18. go serveGames(games)
  19. return games
  20. }
  21. func serveGames(games Games) {
  22. gamesMap := make(map[int64]*Game)
  23. for {
  24. select {
  25. case game := <-games.addChan:
  26. gamesMap[game.Id] = game
  27. case r := <-games.listChan:
  28. v := make([]*Game, 0, len(gamesMap))
  29. for _, value := range gamesMap {
  30. v = append(v, value)
  31. }
  32. r <- v
  33. case r := <-games.getChan:
  34. r.returnChan <- gamesMap[r.id]
  35. }
  36. }
  37. }
  38. func (games Games) AddGame(game *Game) {
  39. games.addChan <- game
  40. }
  41. func (games Games) ListGames() []*Game {
  42. r := make(chan []*Game)
  43. games.listChan <- r
  44. return <-r
  45. }
  46. func (games Games) GetGame(id int64) *Game {
  47. getGame := getGame {
  48. id: id,
  49. returnChan: make(chan *Game),
  50. }
  51. games.getChan <- getGame
  52. return <- getGame.returnChan
  53. }