Redesign using core.async