Two small remarks here:
- we don't need a new function `list_map_filter` since it is simply the composition of `filter` and `map`, which would be clearer (and there is no performance issue here). Batteries has a function called `filter_map` that takes a single function of type `'a -> 'b option` for filtering and mapping at the same time. That's not the case here, though.
- I am strict on the 80-character per line limit