Repository: Shimada666/super-stream (language: python)

Issue:
功能建议： collects，实现 Java 中 collect(collector).stream()
准备提交这个中间操作 `collects` 方法，类似终止操作 `collect` 方法。
``` python
def collects(self, func: Callable[[Iterable[T]], Iterable[R]]) -> 'Stream[R]':
    return Stream(func(self._stream))
```
我自己一直在用到。最近思考了一下，这个方法还有很有必要的。

在 Java Stream 里 collect 是终止操作，但如果 collect 之后需要继续作为流，只需要简单的 `collect(collector).stream()` 就可以实现，因为 Java 的 Collection 类有方法 stream 将 Collection 转为 Stream。

但 super-stream 里 collect 结果是普通的类型了，无法再继续链式操作，因此需要定义一个方法来实现 `collects(collector) = collect(collector).stream()` 。用 collects 这个方法名应该也还合适，取 collect to stream 的意思，类似 collect 方法，但一个是中间操作，一个是终止操作。

使用场景的例子，如 .collects(enumerate) / .collects(itertools.pairwise) / .collects(itertools.groupby) / .collects(itertools.accumulate) 等。

我另外还有几个 commit 想要 PR
``` python
def find_first(self) -> Optional[T]:
    return next(self._stream, None)
```

``` python
def sum(self, start: T = 0) -> T:
    return sum(self._stream, start)
```

还是像现在这样一个一个提交 PR 吗？这样就是合并后会产生好多 Merge pull request 的 commit，不怎么好看。


Discussion / hints:
可以啊。目前期望对于每一个相对独立的功能，单独用一个 pr。commit 多倒不是什么问题。确实是有必要的，可以提交一下。最近 feature 攒的也比较多，提交了之后我发个 0.3  的版本把，感谢感谢
好的。

Fix patch:
diff --git a/README.md b/README.md
index 2514449..872ab14 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,7 @@ pip install superstream
 | -                   | starmap       | map 的 \* 参数解包版本                                                                   |
 | flatMap             | flat_map      |                                                                                          |
 | collect             | collect       |                                                                                          |
+| -                   | collects      | collect 对应的中间操作，collects(collector) 相当于 Java 中的 collect(collector).stream() |
 | collect(groupingBy) | group_by      |                                                                                          |
 | collect(toList)     | to_list       |                                                                                          |
 | collect(toSet)      | to_set        |                                                                                          |
diff --git a/src/superstream/stream.py b/src/superstream/stream.py
index 3a041f2..f22a716 100644
--- a/src/superstream/stream.py
+++ b/src/superstream/stream.py
@@ -131,3 +131,6 @@ def to_map(self, k: Callable[[T], K], v: Callable[[T], U]) -> Dict[K, U]:
 
     def collect(self, func: Callable[[Iterable[T]], R]) -> R:
         return func(self._stream)
+
+    def collects(self, func: Callable[[Iterable[T]], Iterable[R]]) -> 'Stream[R]':
+        return Stream(func(self._stream))


Test patch:
diff --git a/tests/test_stream.py b/tests/test_stream.py
index ce99630..b67b6a0 100644
--- a/tests/test_stream.py
+++ b/tests/test_stream.py
@@ -151,3 +151,8 @@ def test_collect(self):
         a = [1, 2, 3]
         b = Stream(a).collect(set)
         assert b == {1, 2, 3}
+
+    def test_collects(self):
+        a = [1, 2, 3]
+        b = Stream(a).collects(enumerate).filter(lambda x: x[1] % 2 != 0).map(lambda x: x[0]).to_list()
+        assert b == [0, 2]