Type-Driven rather than Test-Driven Approach

Tackled the problem by considering the types and the functions required to map from each type to the next, (See the included diagram). 
Coded the solution entirely guided by the sketched types and functions.
All tests from the previous solution passed.
Added some additional tests afterwards.