|
@@ -147,8 +147,35 @@ class Pipe:
|
|
|
|
|
|
|
|
|
class PipeMap(Pipe):
|
|
|
- def __init__(self, function: typing.Callable[[typing.Any], typing.Any]) -> None:
|
|
|
- self._function = functools.partial(map, function)
|
|
|
-
|
|
|
-
|
|
|
+ @classmethod
|
|
|
+ def _partial_map(
|
|
|
+ cls, function: typing.Callable[[typing.Any], typing.Any], *, axis: int
|
|
|
+ ) -> typing.Callable[[typing.Any], typing.Any]:
|
|
|
+ if axis <= 0:
|
|
|
+ return functools.partial(map, function)
|
|
|
+ return functools.partial(map, cls._partial_map(function, axis=axis - 1))
|
|
|
+
|
|
|
+ def __init__(
|
|
|
+ self, function: typing.Callable[[typing.Any], typing.Any], axis: int = 0
|
|
|
+ ) -> None:
|
|
|
+ self._function = self._partial_map(function, axis=axis)
|
|
|
+
|
|
|
+
|
|
|
+assert list(PipeMap._partial_map(str, axis=0)(range(3))) == ["0", "1", "2"]
|
|
|
+assert [tuple(r) for r in PipeMap._partial_map(str, axis=1)((range(2), range(3)))] == [
|
|
|
+ ("0", "1"),
|
|
|
+ ("0", "1", "2"),
|
|
|
+]
|
|
|
assert range(65, 68) | PipeMap(chr) | PipeMap(str.lower) | Pipe(list) == ["a", "b", "c"]
|
|
|
+assert range(2, 4) | PipeMap(range) | PipeMap(lambda n: n**3, axis=1) | PipeMap(
|
|
|
+ tuple
|
|
|
+) | Pipe(list) == [(0, 1), (0, 1, 8)]
|
|
|
+assert "123\n456\n789".splitlines() | PipeMap(list) | PipeMap(int, axis=1) | PipeMap(
|
|
|
+ tuple
|
|
|
+) | Pipe(list) == [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
|
|
|
+assert "123|456\n98|76|54".splitlines() | PipeMap(lambda s: s.split("|")) | PipeMap(
|
|
|
+ list, axis=1
|
|
|
+) | PipeMap(int, axis=2) | PipeMap(tuple, axis=1) | PipeMap(tuple) | Pipe(list) == [
|
|
|
+ ((1, 2, 3), (4, 5, 6)),
|
|
|
+ ((9, 8), (7, 6), (5, 4)),
|
|
|
+]
|