From 643db2168f72028dfa5859a5be6655526315dffd Mon Sep 17 00:00:00 2001 From: Beno!t POLASZEK Date: Fri, 10 Nov 2023 12:22:27 +0100 Subject: [PATCH] Fix: Chain transformers using generators in the middle (#25) --- src/Transformer/ChainTransformer.php | 20 ++++++++++++++----- .../Unit/Transformer/ChainTransformerTest.php | 4 +++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Transformer/ChainTransformer.php b/src/Transformer/ChainTransformer.php index 956f1de..f598bc2 100644 --- a/src/Transformer/ChainTransformer.php +++ b/src/Transformer/ChainTransformer.php @@ -5,7 +5,7 @@ namespace BenTools\ETL\Transformer; use BenTools\ETL\EtlState; -use BenTools\ETL\Internal\TransformResult; +use Generator; final readonly class ChainTransformer implements TransformerInterface { @@ -32,13 +32,23 @@ public function with(TransformerInterface|callable $transformer): self return new self(...[...$this->transformers, $transformer]); } - public function transform(mixed $item, EtlState $state): mixed + public function transform(mixed $item, EtlState $state): Generator + { + $item = $this->doTransform($item, $state); + + if ($item instanceof Generator) { + yield from $item; + } else { + yield $item; + } + } + + public function doTransform(mixed $item, EtlState $state): mixed { - $output = $item; foreach ($this->transformers as $transformer) { - $output = TransformResult::create($transformer->transform($output, $state))->value; + $item = $items = $transformer->transform($item, $state); } - return $output; + return $item; } } diff --git a/tests/Unit/Transformer/ChainTransformerTest.php b/tests/Unit/Transformer/ChainTransformerTest.php index dedfa1c..63ead71 100644 --- a/tests/Unit/Transformer/ChainTransformerTest.php +++ b/tests/Unit/Transformer/ChainTransformerTest.php @@ -23,6 +23,7 @@ function (string $item): Generator { yield strtoupper($item); }, )) + ->with(fn (Generator $items): array => [...$items]) ->with(function (array $items): array { $items[] = 'hey'; @@ -52,12 +53,13 @@ function (string $item): Generator { yield $item; yield strtoupper($item); }, + fn (Generator $items): array => [...$items], function (array $items): array { $items[] = 'hey'; return $items; }, - fn (array $items): string => implode('-', $items) + fn (array $items) => yield implode('-', $items) ); // When