48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from eca import *
 | |
| 
 | |
| 
 | |
| @event('main')
 | |
| def setup(ctx, e):
 | |
|     """
 | |
|     Initialise the context with an accumulator value, and inform
 | |
|     the user about the fact that we process input.
 | |
|     """
 | |
|     print("Enter a number per line and end with EOF:")
 | |
|     print("(EOF is ctrl+d under linux and MacOSes, ctrl+z followed by return under Windows)")
 | |
|     ctx.accumulator = 0
 | |
|     ctx.count = 0
 | |
| 
 | |
| 
 | |
| @event('line')
 | |
| def line(ctx, e):
 | |
|     """
 | |
|     Tries to parse the input line as a number and add it to the accumulator.
 | |
|     """
 | |
|     try:
 | |
|         value = float(e.data) if '.' in e.data else int(e.data)
 | |
|         ctx.accumulator += value
 | |
|         ctx.count += 1
 | |
|         print("sum = " + str(ctx.accumulator))
 | |
|     except ValueError:
 | |
|         print("'{}' is not a number.".format(e.data))
 | |
| 
 | |
| 
 | |
| @event('end-of-input')
 | |
| @condition(lambda c,e: c.count > 0)
 | |
| def done(ctx, e):
 | |
|     """
 | |
|     Outputs the final average to the user.
 | |
|     """
 | |
|     print("{} samples with average of {}".format(ctx.count, ctx.accumulator / ctx.count))
 | |
|     shutdown()
 | |
| 
 | |
| 
 | |
| @event('end-of-input')
 | |
| @condition(lambda c,e: c.count == 0)
 | |
| def no_input(ctx, e):
 | |
|     """
 | |
|     Invoked of no input is given and input is finished.
 | |
|     """
 | |
|     print("0 samples. \"Does not compute!\"")
 | |
|     shutdown()
 |