Liked:
- The code for block rotation and row removal. The board code got a little complicated (due to an experiment that I kept), but I had tests that made getting that code correct a quick process. I got this working first and really didn't have to touch it again.
- The way the current 'screen' is implemented - just functions in the game state. (Two functions - one like an OO MVC 'controller' and one like a 'view'.)
- Relatively short. Under 500 lines without tests/comments. Probably could be shorter.
- Testing was hard. It seemed like there was a lot of setup for a simple test. I ended up exposing more of a given module than I wanted to make sure that functions that were just used in the module were working correctly. In the end, I wrote far fewer tests than I would have liked. I think a lot of this boils down to not factoring my code well - still trying to figure out how do to that in Haskell.
- Also, not sure how to only test 'part' of something. If A uses B which uses C - how to test A without needing to test the rest. I want to stub or mock the rest, but don't know how.
- Some of the code got too complicated (for example, the 'move' method isn't pretty). For a lot of the code, I didn't feel like I was 'gluing simple functions together'.