Es6

- 使用 generator 重写
- 增加测试用例

#8