Skip to content

Instantly share code, notes, and snippets.

@whardier
Created July 2, 2020 23:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save whardier/ce1c56e7f5821db0bc600c1c18871864 to your computer and use it in GitHub Desktop.
Save whardier/ce1c56e7f5821db0bc600c1c18871864 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3.8
import sys
from collections import Counter
import inflect
root = sys.modules[__name__]
inflector = inflect.engine()
events = [
{"monkey": "Sam", "state": "hungry", "kind": "banana" },
{"monkey": "Chet", "state": "flinging", "kind": "grass" },
{"monkey": "Sam", "state": "flinging", "kind": "grass" },
{"monkey": "Sam", "state": "hungry", "kind": "banana" },
{"monkey": "Chet", "state": "hungry", "kind": "banana" },
{"monkey": "Chet", "state": "flinging", "kind": "feces" },
{"monkey": "Sam", "state": "flinging", "kind": "grass" },
{"monkey": "Sam", "state": "hungry", "kind": "apple" },
]
event_counters = {}
def do_monkey_flinging(event):
print(f"{event['monkey']}:\tdo_monkey_flinging")
def do_monkey_hungry_apple(event):
print(f"{event['monkey']}:\tdo_monkey_hungry_apple")
def do_monkey_hungry_banana_first(event):
print(f"{event['monkey']}:\tdo_monkey_hungry_banana_first")
def do_monkey_hungry_banana_second(event):
print(f"{event['monkey']}:\tdo_monkey_hungry_banana_second (oh no!)")
def dispatch_event(event):
# Make sure each monkey has their own event counter
event_counters.setdefault(event["monkey"], Counter())
event_counter = event_counters[event["monkey"]]
# Compose an event name based on the state and kind values of the event
event_name = f"{event['state']}_{event['kind']}"
# Update counter
event_counter.update([event_name])
event_count = event_counter[event_name]
event_count_words = inflector.number_to_words(inflector.ordinal(event_count)).replace(' ', '_')
# Pass along a useful tidbit if needed
event['_count'] = event_count
callback = None
callback = getattr(root, f"do_monkey_{event['state']}", callback)
callback = getattr(root, f"do_monkey_{event['state']}_{event['kind']}", callback)
callback = getattr(root, f"do_monkey_{event['state']}_{event['kind']}_{event_count_words}", callback)
if callback:
callback(event)
for event in events:
dispatch_event(event)
Sam: do_monkey_hungry_banana_first
Chet: do_monkey_flinging
Sam: do_monkey_flinging
Sam: do_monkey_hungry_banana_second (oh no!)
Chet: do_monkey_hungry_banana_first
Chet: do_monkey_flinging
Sam: do_monkey_flinging
Sam: do_monkey_hungry_apple
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment