Packages

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 by op)

E

the error type (covariant)

alterand

the inner stage whose outputs are reduced

op

the binary operation stage folding two values into one

Linear Supertypes
Serializable, Serializable, Product, Equals, Alterator[Stage[I, O, E], I, O, E], Stage[I, O, E], (I) ⇒ Yield[I, O, E], AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. Reduce
  2. Serializable
  3. Serializable
  4. Product
  5. Equals
  6. Alterator
  7. Stage
  8. Function1
  9. AnyRef
  10. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new Reduce(alterand: Stage[I, O, E], op: Stage[(O, O), O, E])

    alterand

    the inner stage whose outputs are reduced

    op

    the binary operation stage folding two values into one

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. val alterand: Stage[I, O, E]

    The wrapped stage whose behavior is modified by this operator.

    The wrapped stage whose behavior is modified by this operator.

    Definition Classes
    Reduce → Alterator
  5. def andThen[A](g: (Yield[I, O, E]) ⇒ A): (I) ⇒ A
    Definition Classes
    Function1
    Annotations
    @unspecialized()
  6. def apply(in: I): Yield[I, O, E]

    Processes in and returns the Yield carrying the optional output, the status and the continuation.

    Processes in and returns the Yield carrying the optional output, the status and the continuation.

    A stage that throws from here must have released its own resources first — see the Lifecycle section above.

    Definition Classes
    Reduce → Stage → Function1
  7. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  8. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... ) @native() @IntrinsicCandidate()
  9. def compose[A](g: (A) ⇒ I): (A) ⇒ Yield[I, O, E]
    Definition Classes
    Function1
    Annotations
    @unspecialized()
  10. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  11. final def getClass(): Class[_]
    Definition Classes
    AnyRef → Any
    Annotations
    @native() @IntrinsicCandidate()
  12. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  13. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  14. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @IntrinsicCandidate()
  15. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @IntrinsicCandidate()
  16. val op: Stage[(O, O), O, E]
  17. 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 apply whenever 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. Like apply, skip() may perform side effects — a decorator, for instance, may advance or release the inner stage it owns.

    Definition Classes
    Reduce → Stage
  18. final def synchronized[T0](arg0: ⇒ T0): T0
    Definition Classes
    AnyRef
  19. def toString(): String
    Definition Classes
    Function1 → AnyRef → Any
  20. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  21. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... ) @native()
  22. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  23. 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

  1. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] ) @Deprecated
    Deprecated

Inherited from Serializable

Inherited from Serializable

Inherited from Product

Inherited from Equals

Inherited from Alterator[Stage[I, O, E], I, O, E]

Inherited from Stage[I, O, E]

Inherited from (I) ⇒ Yield[I, O, E]

Inherited from AnyRef

Inherited from Any

Ungrouped