@ithayer: first/last monoids, split values by arbitrary functions. for #11