I've got nearly all the components of Mythic's fate roll put together. The sheer volume of code I've written for this makes me kind of question my approach here, but I'm hoping this is just kind of a reflection of the underying complexity of the full rules.
I'm kind of reeling from all of that.
Anyway, I also put together Pyinstrument profiling for all of the packages. Right now, it only works on the test suites, so it's not really representative, although it does confirm that my very newest code in the punq fork takes up a huge portion of execution time. I'm not up for much more tonight, but I will try slapping an LRU cache on the top-level function and see if that does anything. Okay, that makes the tests up to ten times faster, which is helpful. It's unlikely that the shiv will benefit as much, since the cache gets thrown away at the end, but this will probably be extemely helpful once I start putting together larger apps using this same code.
One thing I realized from putting together the Mythic stuff, and I'll have to do something about this later, is that I picked the wrong signature for prompting the user for input. When using Tk, this is going to be, like, a modal popup with generated widgets. Currently, the interface is "give user string, receive string from user", which can't work with that generically, unless I write a parser to parse out the string that I just generated, which I'm not going to do. I'm going to need to make the interface something like "provide a Question[T], receive a T", where the Question type does not exist yet. To figure out what kind of range it needs to allow, I'm going to have to review all of the systems I want to port.
None of that is going to happen today, because it is almost midnight now.