OrElse stage for fallback when no elements emitted #21024
This commit is contained in:
parent
fbfc8b4c58
commit
012919fdb3
12 changed files with 465 additions and 7 deletions
|
|
@ -1793,6 +1793,40 @@ trait FlowOps[+Out, +Mat] {
|
|||
FlowShape(merge.in(1), merge.out)
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a secondary source that will be consumed if this stream completes without any
|
||||
* elements passing by. As soon as the first element comes through this stream, the alternative
|
||||
* will be cancelled.
|
||||
*
|
||||
* Note that this Flow will be materialized together with the [[Source]] and just kept
|
||||
* from producing elements by asserting back-pressure until its time comes or it gets
|
||||
* cancelled.
|
||||
*
|
||||
* On errors the stage is failed regardless of source of the error.
|
||||
*
|
||||
* '''Emits when''' element is available from first stream or first stream closed without emitting any elements and an element
|
||||
* is available from the second stream
|
||||
*
|
||||
* '''Backpressures when''' downstream backpressures
|
||||
*
|
||||
* '''Completes when''' the primary stream completes after emitting at least one element, when the primary stream completes
|
||||
* without emitting and the secondary stream already has completed or when the secondary stream completes
|
||||
*
|
||||
* '''Cancels when''' downstream cancels and additionally the alternative is cancelled as soon as an element passes
|
||||
* by from this stream.
|
||||
*/
|
||||
def orElse[U >: Out, Mat2](secondary: Graph[SourceShape[U], Mat2]): Repr[U] =
|
||||
via(orElseGraph(secondary))
|
||||
|
||||
protected def orElseGraph[U >: Out, Mat2](secondary: Graph[SourceShape[U], Mat2]): Graph[FlowShape[Out @uncheckedVariance, U], Mat2] =
|
||||
GraphDSL.create(secondary) { implicit b ⇒ secondary ⇒
|
||||
val orElse = b.add(OrElse[U]())
|
||||
|
||||
secondary ~> orElse.in(1)
|
||||
|
||||
FlowShape(orElse.in(0), orElse.out)
|
||||
}
|
||||
|
||||
/**
|
||||
* Concatenates this [[Flow]] with the given [[Source]] so the first element
|
||||
* emitted by that source is emitted after the last element of this
|
||||
|
|
@ -2031,6 +2065,31 @@ trait FlowOpsMat[+Out, +Mat] extends FlowOps[Out, Mat] {
|
|||
def prependMat[U >: Out, Mat2, Mat3](that: Graph[SourceShape[U], Mat2])(matF: (Mat, Mat2) ⇒ Mat3): ReprMat[U, Mat3] =
|
||||
viaMat(prependGraph(that))(matF)
|
||||
|
||||
/**
|
||||
* Provides a secondary source that will be consumed if this stream completes without any
|
||||
* elements passing by. As soon as the first element comes through this stream, the alternative
|
||||
* will be cancelled.
|
||||
*
|
||||
* Note that this Flow will be materialized together with the [[Source]] and just kept
|
||||
* from producing elements by asserting back-pressure until its time comes or it gets
|
||||
* cancelled.
|
||||
*
|
||||
* On errors the stage is failed regardless of source of the error.
|
||||
*
|
||||
* '''Emits when''' element is available from first stream or first stream closed without emitting any elements and an element
|
||||
* is available from the second stream
|
||||
*
|
||||
* '''Backpressures when''' downstream backpressures
|
||||
*
|
||||
* '''Completes when''' the primary stream completes after emitting at least one element, when the primary stream completes
|
||||
* without emitting and the secondary stream already has completed or when the secondary stream completes
|
||||
*
|
||||
* '''Cancels when''' downstream cancels and additionally the alternative is cancelled as soon as an element passes
|
||||
* by from this stream.
|
||||
*/
|
||||
def orElseMat[U >: Out, Mat2, Mat3](secondary: Graph[SourceShape[U], Mat2])(matF: (Mat, Mat2) ⇒ Mat3): ReprMat[U, Mat3] =
|
||||
viaMat(orElseGraph(secondary))(matF)
|
||||
|
||||
/**
|
||||
* Attaches the given [[Sink]] to this [[Flow]], meaning that elements that passes
|
||||
* through will also be sent to the [[Sink]].
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue