Full threadgrantcarthew·I just whacked this together last night. I've been using it in another project but it was so useful that I wanted it as a standalone package.View on HN