1: <?php declare(strict_types=1);
2:
3: namespace Salient\Contract\Core\Pipeline;
4:
5: use Salient\Contract\Core\ArrayMapperInterface;
6: use Salient\Contract\Core\Chainable;
7: use Salient\Contract\Core\Immutable;
8: use Closure;
9:
10: /**
11: * @template TInput
12: * @template TOutput
13: * @template TArgument
14: */
15: interface BasePipelineInterface extends Chainable, Immutable
16: {
17: /**
18: * Apply a closure to each payload before it is sent
19: *
20: * This method can only be called once per pipeline.
21: *
22: * @param Closure(TInput $payload, static $pipeline, TArgument $arg): (TInput|TOutput) $closure
23: * @return static
24: */
25: public function after(Closure $closure);
26:
27: /**
28: * Apply a closure to each payload before it is sent if after() hasn't
29: * already been called
30: *
31: * @param Closure(TInput $payload, static $pipeline, TArgument $arg): (TInput|TOutput) $closure
32: * @return static
33: */
34: public function afterIf(Closure $closure);
35:
36: /**
37: * Add a pipe to the pipeline
38: *
39: * A pipe must be one of the following:
40: *
41: * - an instance of a class that implements {@see PipeInterface}
42: * - the name of a class that implements {@see PipeInterface}
43: * - a closure
44: *
45: * Whichever form it takes, a pipe should do something with `$payload`
46: * before taking one of the following actions:
47: *
48: * - return the value of `$next($payload)`
49: * - return a value that will be discarded by
50: * {@see StreamPipelineInterface::unless()}, bypassing any remaining pipes
51: * and {@see BasePipelineInterface::then()}, if applicable
52: * - throw an exception
53: *
54: * @param (Closure(TInput $payload, Closure $next, static $pipeline, TArgument $arg): (TInput|TOutput))|(Closure(TOutput $payload, Closure $next, static $pipeline, TArgument $arg): TOutput)|PipeInterface<TInput,TOutput,TArgument>|class-string<PipeInterface<TInput,TOutput,TArgument>> $pipe
55: * @return static
56: */
57: public function through($pipe);
58:
59: /**
60: * Add a simple closure to the pipeline
61: *
62: * @param (Closure(TInput $payload, static $pipeline, TArgument $arg): (TInput|TOutput))|(Closure(TOutput $payload, static $pipeline, TArgument $arg): TOutput) $closure
63: * @return static
64: */
65: public function throughClosure(Closure $closure);
66:
67: /**
68: * Add an array key mapper to the pipeline
69: *
70: * @param array<array-key,array-key|array-key[]> $keyMap An array that maps
71: * input keys to one or more output keys.
72: * @param int-mask-of<ArrayMapperInterface::*> $flags
73: * @return static
74: */
75: public function throughKeyMap(array $keyMap, int $flags = ArrayMapperInterface::ADD_UNMAPPED);
76:
77: /**
78: * Apply a closure to each result
79: *
80: * This method can only be called once per pipeline, and only if
81: * {@see StreamPipelineInterface::collectThen()} is not also called.
82: *
83: * @param (Closure(TInput $result, static $pipeline, TArgument $arg): TOutput)|(Closure(TOutput $result, static $pipeline, TArgument $arg): TOutput) $closure
84: * @return static
85: */
86: public function then(Closure $closure);
87:
88: /**
89: * Apply a closure to each result if then() hasn't already been called
90: *
91: * @param (Closure(TInput $result, static $pipeline, TArgument $arg): TOutput)|(Closure(TOutput $result, static $pipeline, TArgument $arg): TOutput) $closure
92: * @return static
93: */
94: public function thenIf(Closure $closure);
95:
96: /**
97: * Pass each result to a closure
98: *
99: * Results not discarded by {@see StreamPipelineInterface::unless()} are
100: * passed to the closure before leaving the pipeline. The closure's return
101: * value is ignored.
102: *
103: * @param Closure(TOutput $result, static $pipeline, TArgument $arg): mixed $closure
104: * @return static
105: */
106: public function cc(Closure $closure);
107: }
108: