final case class Reduce[-I, O, +E](alterand: Stage[I, O, E], op: Stage[(O, O), O, E]) extends Decorator[I, O, E] with Product with Serializable
A decorator that drives a whole cycle of the inner stage per outer run — like Repeat, on the same outer input —
folding every output the inner stage produces into an accumulator with the binary operation stage op.
The first output becomes the accumulator without invoking op (the classic seedless reduce); each subsequent output
is folded via op((accumulator, output)). In an iteration with nothing to fold — the inner stage produced no
output, or the output is the first one — op is skipped, so each iteration performs exactly one of apply/skip
on both inner stages, as the lifecycle contract requires. An iteration yielding no output with
h8io.stages.Status.Success keeps the cycle spinning, like Repeat. The cycle is @tailrec and does not grow
the stack.
When op is applied but itself yields no output for a given fold — e.g. it filters some outputs out — the
accumulator is left unchanged rather than discarded, exactly as in Fold. op's status is still combined into
the iteration's status in this case, since op was applied, not skipped, for that output.
The cycle stops when the status of an iteration is h8io.stages.Status.Complete: an error-free Complete is
reported to the enclosing pipeline as Success, a Complete with errors is preserved. The value accumulated so
far, if any, is yielded. The accumulator is local to one outer run: the next generation of Reduce starts empty.
The inner pipeline
alterand and op together form the inner pipeline of Reduce, with op downstream of alterand. An iteration's
status is therefore the combination of their statuses in pipeline order (alterand first), and both continuations
are selected by that combined status — exactly as h8io.stages.Evolution.AndThen evolves both sides of a composed
pipeline with the status of the whole run, never with the stages' individual statuses.
As in Loop and Repeat, the continuations are never selected by the status Reduce reports to the enclosing
pipeline — the two differ, since an error-free Complete is absorbed into a Success — and for the same reason the
returned evolution is a h8io.stages.base.ConstEvolution. Its dispose releases both inner evolutions via
h8io.stages.Evolution.dispose (op first, then alterand), which per the h8io.stages.Evolution contract stay
the terminal cleanup handles of the generation just constructed. Symmetrically a skipped Reduce skips both inner
stages and selects their continuations on the neutral Status.Success.
- I
the input type (contravariant)
- O
the value type being reduced (invariant: produced by
alterand, consumed in pairs byop)- E
the error type (covariant)
- alterand
the inner stage whose outputs are reduced
- op
the binary operation stage folding two values into one
- Alphabetic
- By Inheritance
- Reduce
- Serializable
- Serializable
- Product
- Equals
- Alterator
- Stage
- Function1
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
val
alterand: Stage[I, O, E]
The wrapped stage whose behavior is modified by this operator.
-
def
andThen[A](g: (Yield[I, O, E]) ⇒ A): (I) ⇒ A
- Definition Classes
- Function1
- Annotations
- @unspecialized()
-
def
apply(in: I): Yield[I, O, E]
Processes
inand returns the Yield carrying the optional output, the status and the continuation. -
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native() @IntrinsicCandidate()
-
def
compose[A](g: (A) ⇒ I): (A) ⇒ Yield[I, O, E]
- Definition Classes
- Function1
- Annotations
- @unspecialized()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- val op: Stage[(O, O), O, E]
-
def
skip(): Evolution[I, O, E]
Returns this stage's Evolution without consuming an input.
Returns this stage's Evolution without consuming an input.
Called instead of
applywhenever the stage takes part in a run but has nothing to process: the upstream yielded no output, or a binary operator excluded this branch. The evolution must be the one the stage would have returned had it run. Likeapply,skip()may perform side effects — a decorator, for instance, may advance or release the inner stage it owns. -
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- Function1 → AnyRef → Any
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
~>[_O, _E >: E](that: Stage[O, _O, _E]): Stage[I, _O, _E]
Composes this stage with
that, feeding this stage's output into it.Composes this stage with
that, feeding this stage's output into it. See the Composition section above for what happens when there is no output to feed.- Definition Classes
- Stage
- Annotations
- @inline()
Deprecated Value Members
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] ) @Deprecated
- Deprecated