each() suppresses null results at end of closed channel
added a filter() function in util; more example refactoring