| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package games
- type Games struct {
- addChan chan *Game
- listChan chan listChan
- getChan chan getGame
- }
- type listChan chan []*Game
- type getGame struct {
- id int64
- returnChan chan *Game
- }
- func New() Games {
- games := Games{
- addChan: make(chan *Game),
- listChan: make(chan listChan),
- getChan: make(chan getGame),
- }
- go serveGames(games)
- return games
- }
- func serveGames(games Games) {
- gamesMap := make(map[int64]*Game)
- for {
- select {
- case game := <-games.addChan:
- gamesMap[game.Id] = game
- case r := <-games.listChan:
- v := make([]*Game, 0, len(gamesMap))
- for _, value := range gamesMap {
- v = append(v, value)
- }
- r <- v
- case r := <-games.getChan:
- r.returnChan <- gamesMap[r.id]
- }
- }
- }
- func (games Games) AddGame(game *Game) {
- games.addChan <- game
- }
- func (games Games) ListGames() []*Game {
- r := make(chan []*Game)
- games.listChan <- r
- return <-r
- }
- func (games Games) GetGame(id int64) *Game {
- getGame := getGame {
- id: id,
- returnChan: make(chan *Game),
-
- }
- games.getChan <- getGame
- return <- getGame.returnChan
- }
|