I think it may be necessary to break down how each of the new core.async constructs work; there is a lot of new stuff here, and recipes such as this usually go over their solution piece-by-piece, explaining how to use the interface of a given library or tool.