'''
	Made at 2020-05-07 15:31:52

	Asyncio Racing Show

	run with:
		$ clear; python3 -uB comp_simple.py

'''

import asyncio, random, queue

failed_runners = queue.Queue()
flag = False

# first runner
async def runner1(name):
	global flag, failed_runners

	for i in range(5):
		# print(f'RUNNING Mr.{name} at {i} meters')
		await asyncio.sleep(random.randint(1,2)/100)

	if not flag: # if nobody grabbed the flag -> I won.
		flag = f'   Mister {name}'
		print(f'  flag is taken by Mr.{name}\n')
	else: # if flag is gone -> I failed.
		failed_runners.put(f'Finished, but failed "Mr.{name}"')

# other runners
async def runner2(name):
	# thesame code, as in runner1
	global flag, failed_runners

	for i in range(5):
		# print(f'RUNNING Mr.{name} at {i} meters')
		await asyncio.sleep(random.randint(1,2)/100)

	if not flag: # if nobody grabbed the flag -> I won.
		flag = f'   Mister {name}'
		print(f'  flag is taken by Mr.{name}\n')
	else: # if flag is gone -> I failed.
		failed_runners.put(f'Finished, but failed "Mr.{name}"')

async def runner3(name):
	# thesame code, as in runner1
	global flag, failed_runners

	for i in range(5):
		# print(f'RUNNING Mr.{name} at {i} meters')
		await asyncio.sleep(random.randint(1,2)/100)

	if not flag: # if nobody grabbed the flag -> I won.
		flag = f'   Mister {name}'
		print(f'  flag is taken by Mr.{name}\n')
	else: # if flag is gone -> I failed.
		failed_runners.put(f'Finished, but failed "Mr.{name}"')

# a while-true checker + little async sleep.
async def checker():
	global flag, failed_runners
	print('START of COMPETITION')
	
	# Let the race BEGIN!
	while not flag:
		# let's wait for flag state more
		await asyncio.sleep(.001)

	# Race Finished! Let's do conclusions:
	
	# show winner
	print(' ', '-'*30, f'\n  WINNER is {flag.strip()}! Congrats!')

	# IF there are failers - show them
	if not failed_runners.empty():
		print('  list of failers:')
		while not failed_runners.empty():
			item = failed_runners.get()
			if item is not None: print(f'   >>> {item}')
			else: break

	
	print('\nEND OF COMPETITION')

print('global START\n')

loop = asyncio.get_event_loop()
# in 4 tasks in asyncs loop
loop.run_until_complete(asyncio.gather(
					runner1(1), runner2(2), runner3(3)
					,checker()))
loop.close()
print('\nglobal END')