|
6 | 6 |
|
7 | 7 | use RunOpenCode\Component\Dataset\AbstractStream; |
8 | 8 | use RunOpenCode\Component\Dataset\Contract\OperatorInterface; |
| 9 | +use RunOpenCode\Component\Dataset\Exception\LogicException; |
9 | 10 |
|
10 | 11 | /** |
11 | 12 | * Map operator. |
12 | 13 | * |
13 | 14 | * Map operator iterates over given collection and yields transformed items. |
14 | 15 | * |
15 | | - * User must provide a callable to transform each item value. Additionally, |
16 | | - * user may provide a callable to transform each item key. If key transform |
17 | | - * callable is not provided, original keys are preserved. |
| 16 | + * User must provide a callable to transform each item value, or callable to |
| 17 | + * transform each item key, or both. |
| 18 | + * |
| 19 | + * Where transforming function is not provided, original values will be |
| 20 | + * preserved. |
18 | 21 | * |
19 | 22 | * Example usage: |
20 | 23 | * |
@@ -47,18 +50,22 @@ final class Map extends AbstractStream implements OperatorInterface |
47 | 50 | private readonly \Closure $keyTransform; |
48 | 51 |
|
49 | 52 | /** |
50 | | - * @param iterable<TKey, TValue> $collection Collection to iterate over. |
51 | | - * @param ValueTransformCallable $valueTransform User defined callable to transform item values. |
52 | | - * @param KeyTransformCallable|null $keyTransform User defined callable to transform item keys. If null, original keys are preserved. |
| 53 | + * @param iterable<TKey, TValue> $collection Collection to iterate over. |
| 54 | + * @param ValueTransformCallable|null $valueTransform User defined callable to transform item values. If null, original values are preserved. |
| 55 | + * @param KeyTransformCallable|null $keyTransform User defined callable to transform item keys. If null, original keys are preserved. |
53 | 56 | */ |
54 | 57 | public function __construct( |
55 | 58 | private readonly iterable $collection, |
56 | | - callable $valueTransform, |
| 59 | + ?callable $valueTransform = null, |
57 | 60 | ?callable $keyTransform = null |
58 | 61 | ) { |
| 62 | + if (null === $valueTransform && null === $keyTransform) { |
| 63 | + throw new LogicException('At least one transforming function must be provided, either for key or for value.'); |
| 64 | + } |
| 65 | + |
59 | 66 | parent::__construct($this->collection); |
60 | | - $this->valueTransform = $valueTransform(...); |
61 | | - $this->keyTransform = ($keyTransform ?? static fn($key, $value): mixed => $key)(...); |
| 67 | + $this->valueTransform = ($valueTransform ?? static fn(mixed $value, mixed $key): mixed => $value)(...); |
| 68 | + $this->keyTransform = ($keyTransform ?? static fn(mixed $key, mixed $value): mixed => $key)(...); |
62 | 69 | } |
63 | 70 |
|
64 | 71 | /** |
|
0 commit comments