updateWorld
of @Changaco can still be improved. I'll show it gradually so you can see what's going on.
Firstly, we can eliminate duplication in case
statement and use lens composition to eliminate second over
:
quantity Polymorph = quantityPolymorph
quantity TeamPlayer = quantityTeamPlayer
quantity LoneWolf = quantityLoneWolf
updateWorld :: Fighter -> World -> World
updateWorld fighter w = increment (quantity fighter) w where
increment field = over (quantities . field) (+1)
Then we can go pointfree. Pointfree is all about readability so don't do it whenever you feel readability is harmed. With coding experience more and more code will become readable for you.
updateWorld = increment . quantity where
increment field = over (quantities . field) (+1)
Then we replace over
with a more specialized version of it from Control.Lens.Setter
:
updateWorld = increment . quantity where
increment field = (quantities . field) +~ 1
Now it seems beneficial to inline increment
. I'll do in 2 steps. First, I make the actual parameter of increment
explicit:
updateWorld field = increment $ quantity field where
increment field = (quantities . field) +~ 1
Then I inline:
updateWorld :: Fighter -> World -> World
updateWorld field = (quantities . quantity field) +~ 1