#
#   Restaurant model - version 2
#

from cofunctions import *
from simulation import start, hold, now, run
from resource import Resource

import random
random.seed(12345)

@cofunction
def generate_customers(cocall, howmany):
	for i in range(howmany):
		print("Generating a customer at", now())
		start(customer, i)
		yield cocall(hold, random.expovariate(1/5))

tables = Resource(3)
waiters = Resource(1)

@cofunction
def customer(cocall, i):
	print("Customer", i, "arriving at", now())
	yield cocall(tables.acquire, 1)
	print("Customer", i, "sits down at a table at", now())
	yield cocall(waiters.acquire, 1)
	print("Customer", i, "orders spam at", now())
	yield cocall(hold, random.normalvariate(20, 2))
	waiters.release(1)
	print("Customer", i, "gets served spam at", now())
	yield cocall(hold, random.normalvariate(10, 5))
	print("Customer", i, "finished eating at", now())
	tables.release(1)

start(generate_customers, 5)
run()