Skip to content

Instantly share code, notes, and snippets.

@erichnascimento
Last active February 6, 2017 15:33
Show Gist options
  • Save erichnascimento/31f12b366d9871772bb641b128591562 to your computer and use it in GitHub Desktop.
Save erichnascimento/31f12b366d9871772bb641b128591562 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"log"
"math/rand"
"time"
)
var massas = []string{"fina", "media", "grossa"}
var bordas = []string{"normal", "catupiri", "cheddar"}
var recheios = []string{"calabresa", "napolitana", "portuguesa", "rúcula"}
func sort(values []string) string {
rand.Seed(time.Now().Unix())
return values[rand.Intn(len(values))]
}
type Pedido struct {
TipoMassa string
TipoBorda string
TipoRecheio string
}
type Pizza struct {
Massa string
Borda string
Recheio string
}
type PedidoPizza struct {
Pedido *Pedido
Pizza *Pizza
}
func qualOSeuPedidoSenhor() *Pedido {
return &Pedido{
TipoMassa: sort(massas),
TipoBorda: sort(bordas),
TipoRecheio: sort(recheios),
}
}
func iniciarAtendimento(totalAtendentes int, maxPedidos int) <-chan *PedidoPizza {
pedidosPizza := make(chan *PedidoPizza, totalAtendentes)
go func() {
for i := 1; i <= maxPedidos; i++ {
time.Sleep(1 * time.Second)
pedidosPizza <- &PedidoPizza{Pedido: qualOSeuPedidoSenhor()}
log.Printf("Novo pedido nº: %d", i)
}
log.Println("Atendimento encerrado")
close(pedidosPizza)
}()
return pedidosPizza
}
func amassar(todos <-chan *PedidoPizza) <-chan *PedidoPizza {
dones := make(chan *PedidoPizza)
go func() {
for todo := range todos {
// Tempo de preparo
time.Sleep(3 * time.Second)
// Pizza criada
todo.Pizza = &Pizza{}
// Massa pronta
todo.Pizza.Massa = todo.Pedido.TipoMassa
// Entrega a pizza'
dones <- todo
}
log.Println("Amassador dispensado")
close(dones)
}()
return dones
}
func bordar(todos <-chan *PedidoPizza) <-chan *PedidoPizza {
dones := make(chan *PedidoPizza)
go func() {
for todo := range todos {
// Tempo de preparo da borda
time.Sleep(1 * time.Second)
// Borda pronta
todo.Pizza.Borda = todo.Pedido.TipoBorda
// Entrega a pizza'
dones <- todo
}
log.Println("Bordador dispensado")
close(dones)
}()
return dones
}
func rechear(todos <-chan *PedidoPizza) <-chan *PedidoPizza {
dones := make(chan *PedidoPizza)
go func() {
for todo := range todos {
// Tempo de recheio
time.Sleep(2 * time.Second)
// Recheio pronto
todo.Pizza.Recheio = todo.Pedido.TipoRecheio
// Entrega a pizza
dones <- todo
}
log.Println("Recheador dispensado")
close(dones)
}()
return dones
}
func main() {
p, a := 10, 10
log.Printf("Pizzaria aberta para atender %d pedido(s) com %d atendente(s)", p, a)
pedidos := iniciarAtendimento(a, p)
amassadas := amassar(pedidos)
bordadas := bordar(amassadas)
recheadas := rechear(bordadas)
for done := range recheadas {
fmt.Printf(
"Pronto senhor: Massa: %s, Borda: %s, Recheio: %s\n",
done.Pizza.Massa, done.Pizza.Borda, done.Pizza.Recheio,
)
}
log.Println("Pizzaria fechada")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment