Click to read info
At first I thought this project was actually going to be relatively simple to implement, but it actually ended up being quite challenging and fun to do. The difficulty here was actually in the discovery of inference methods much more than the code implementation of them.
This was my first time learing and applying set theory, although it wasn't actually until after I had started work on the inference logic that I realized that. Speaking of: I've also tried to document the theory/proof behind what my code does on a page in that repo. Hopefully it's as interesting to read as it was to write.
I also decided to eventually port the core of the inference logic to Rust (with WebAssembly), because I noticed performance issues for a feature to determine the most likely guilty cards (since it's essentially just brute-forcing all possible hand arrangements given the current data). That was my first time ever using WebAssembly.
After porting to Rust, I ended up becoming somewhat obsessed with hyper-optimizing my code to run as fast as possible. I've managed to make it something like 30× faster than it was with the original TypeScript, even while adding new and often complex inference methods.
I've been invited to help maintain this project, along with a handful of some other great developers: https://github.com/orgs/color-js/people. Most of my work here is on writing and updating typings for TypeScript support.