final class Stream[+F[_], +O] extends AnyRef
A stream producing output of type O
and which may evaluate F
effects.
- Purely functional a value of type Stream[F, O]
_describes_ an effectful computation.
A function that returns a Stream[F, O]
builds a _description_ of an effectful computation,
but does not perform them. The methods of the Stream
class derive new descriptions from others.
This is similar to how effect types like cats.effect.IO
and monix.Task
build descriptions of
computations.
- Pull: to evaluate a stream, a consumer pulls its values from it, by repeatedly performing one pull step at a time.
Each step is a F
-effectful computation that may yield some O
values (or none), and a stream from which to continue pulling.
The consumer controls the evaluation of the stream, which effectful operations are performed, and when.
- Non-Strict: stream evaluation only pulls from the stream a prefix large enough to compute its results.
Thus, although a stream may yield an unbounded number of values or, after successfully yielding several values,
either raise an error or hang up and never yield any value, the consumer need not reach those points of failure.
For the same reason, in general, no effect in F
is evaluated unless and until the consumer needs it.
- Abstract: a stream needs not be a plain finite list of fixed effectful computations in F. It can also represent an input or output connection through which data incrementally arrives. It can represent an effectful computation, such as reading the system's time, that can be re-evaluated as often as the consumer of the stream requires.
Special properties for streams
There are some special properties or cases of streams:
- A stream is finite if we can reach the end after a limited number of pull steps, which may yield a finite number of values. It is empty if it terminates and yields no values.
- A singleton stream is a stream that ends after yielding one single value.
- A pure stream is one in which the
F
is Pure, which indicates that it evaluates no effects. - A never stream is a stream that never terminates and never yields any value.
Pure Streams and operations
We can sometimes think of streams, naively, as lists of O
elements with F
-effects.
This is particularly true for pure streams, which are instances of Stream
which use the Pure effect type.
We can convert every pure and finite stream into a List[O]
using the .toList
method.
Also, we can convert pure infinite streams into instances of the Stream[O]
class from the Scala standard library.
A method of the Stream
class is pure if it can be applied to pure streams. Such methods are identified
in that their signature includes no type-class constraint (or implicit parameter) on the F
method.
Pure methods in Stream[F, O]
can be projected naturally to methods in the List
class, which means
that applying the stream's method and converting the result to a list gets the same result as
first converting the stream to a list, and then applying list methods.
Some methods that project directly to list are map
, filter
, takeWhile
, etc.
There are other methods, like exists
or find
, that in the List
class they return a value or an Option
,
but their stream counterparts return an (either empty or singleton) stream.
Other methods, like zipWithPrevious
, have a more complicated but still pure translation to list methods.
Type-Class instances and laws of the Stream Operations
Laws (using infix syntax):
append
forms a monoid in conjunction with empty
:
empty append s == s
ands append empty == s
.(s1 append s2) append s3 == s1 append (s2 append s3)
And cons
is consistent with using ++
to prepend a single chunk:
s.cons(c) == Stream.chunk(c) ++ s
Stream.raiseError
propagates until being caught by handleErrorWith
:
Stream.raiseError(e) handleErrorWith h == h(e)
Stream.raiseError(e) ++ s == Stream.raiseError(e)
Stream.raiseError(e) flatMap f == Stream.raiseError(e)
Stream
forms a monad with emit
and flatMap
:
Stream.emit >=> f == f
(left identity)f >=> Stream.emit === f
(right identity - note weaker equality notion here)(f >=> g) >=> h == f >=> (g >=> h)
(associativity) whereStream.emit(a)
is defined aschunk(Chunk.singleton(a))
andf >=> g
is defined asa => a flatMap f flatMap g
The monad is the list-style sequencing monad:
(a ++ b) flatMap f == (a flatMap f) ++ (b flatMap f)
Stream.empty flatMap f == Stream.empty
Technical notes
Note: since the chunk structure of the stream is observable, and
s flatMap Stream.emit
produces a stream of singleton chunks,
the right identity law uses a weaker notion of equality, ===
which
normalizes both sides with respect to chunk structure:
(s1 === s2) = normalize(s1) == normalize(s2)
where ==
is full equality
(a == b
iff f(a)
is identical to f(b)
for all f
)
normalize(s)
can be defined as s.flatMap(Stream.emit)
, which just
produces a singly-chunked stream from any input stream s
.
For instance, for a stream s
and a function f: A => B
,
- the result of s.map(f)
is a Stream with the same _chunking_ as the s
; whereas...
- the result of s.flatMap(x => S.emit(f(x)))
is a Stream structured as a sequence of singleton chunks.
The latter is using the definition of map
that is derived from the Monad
instance.
This is not unlike equality for maps or sets, which is defined by which elements they contain,
not by how these are spread between a tree's branches or a hashtable buckets.
However, a Stream
structure can be _observed_ through the chunks
method,
so two streams "_equal_" under that notion may give different results through this method.
Note: For efficiency Stream.map
function operates on an entire
chunk at a time and preserves chunk structure, which differs from
the map
derived from the monad (s map f == s flatMap (f andThen Stream.emit)
)
which would produce singleton chunk. In particular, if f
throws errors, the
chunked version will fail on the first chunk with an error, while
the unchunked version will fail on the first element with an error.
Exceptions in pure code like this are strongly discouraged.
- Source
- Stream.scala
- Alphabetic
- By Inheritance
- Stream
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
def
++[F2[x] >: F[x], O2 >: O](s2: ⇒ Stream[F2, O2]): Stream[F2, O2]
Appends
s2
to the end of this stream.Appends
s2
to the end of this stream.scala> (Stream(1,2,3) ++ Stream(4,5,6)).toList res0: List[Int] = List(1, 2, 3, 4, 5, 6)
If
this
stream is infinite, then the result is equivalent tothis
.
Example: -
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
>>[F2[x] >: F[x], O2](s2: ⇒ Stream[F2, O2])(implicit ev: NotGiven[<:<[O, Nothing]]): Stream[F2, O2]
Alias for
flatMap(_ => s2)
. -
def
append[F2[x] >: F[x], O2 >: O](s2: ⇒ Stream[F2, O2]): Stream[F2, O2]
Appends
s2
to the end of this stream.Appends
s2
to the end of this stream. Alias fors1 ++ s2
. -
def
as[O2](o2: O2): Stream[F, O2]
Equivalent to
val o2Memoized = o2; _.map(_ => o2Memoized)
.Equivalent to
val o2Memoized = o2; _.map(_ => o2Memoized)
.scala> Stream(1,2,3).as(0).toList res0: List[Int] = List(0, 0, 0)
Example: -
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
attempt: Stream[F, Either[Throwable, O]]
Returns a stream of
O
values wrapped inRight
until the first error, which is emitted wrapped inLeft
.Returns a stream of
O
values wrapped inRight
until the first error, which is emitted wrapped inLeft
.scala> import cats.effect.SyncIO scala> (Stream(1,2,3) ++ Stream.raiseError[SyncIO](new RuntimeException) ++ Stream(4,5,6)).attempt.compile.toList.unsafeRunSync() res0: List[Either[Throwable,Int]] = List(Right(1), Right(2), Right(3), Left(java.lang.RuntimeException))
rethrow is the inverse of
attempt
, with the caveat that anything after the first failure is discarded.
Example: -
def
attempts[F2[x] >: F[x]](delays: Stream[F2, FiniteDuration])(implicit arg0: Temporal[F2]): Stream[F2, Either[Throwable, O]]
Retries on failure, returning a stream of attempts that can be manipulated with standard stream operations such as
take
,collectFirst
andinterruptWhen
.Retries on failure, returning a stream of attempts that can be manipulated with standard stream operations such as
take
,collectFirst
andinterruptWhen
.Note: The resulting stream does *not* automatically halt at the first successful attempt. Also see
retry
. -
def
broadcastThrough[F2[x] >: F[x], O2](pipes: Pipe[F2, O, O2]*)(implicit arg0: Concurrent[F2]): Stream[F2, O2]
Feeds the values from this stream (source) to all the given pipes, which process them in parallel, and coordinates their progress.
Feeds the values from this stream (source) to all the given pipes, which process them in parallel, and coordinates their progress.
The new stream has one instance of
this
stream (the source), from which it pulls its outputs. To balance the progress amongst pipes and source, outputs are passed chunk-by-chunk, via a Topic. This creates a one-chunk buffer in front of each pipe. A pipe starts processing a chunk after pulling it from its buffer. The topic enforces some temporal constraints: - No chunk is pushed to the buffer of any pipe until after the previous chunk has been published to all pipes. - No chunk is pushed to a pipe until the pipe pulls the previous chunk. - A chunk may be pushed to some pipes, and pulled by them, before other pipes have pulled the previous chunk.Thus, in processing source values, a fast pipe may be up to two chunks ahead of a slower one. This keeps a balance of progress, and prevents any pipe from getting too far ahead. On the other hand, this slows down fast pipes until slower ones catch up. To ameliorate this, consider using a
prefetch
combinators on the slow pipes.**Error** Any error raised from the input stream, or from any pipe, will stop the pulling from
this
stream and from any pipe, and the error will be raised by the resulting stream.**Output**: the result stream collects and emits the outputs emitted from each pipe, mixed in an unknown way, with these guarantees: 1. each output chunk was emitted by one pipe exactly once. 2. chunks from each pipe come out of the resulting stream in the same order as they came out of the pipe, and without skipping any chunk.
-
def
buffer(n: Int): Stream[F, O]
Behaves like the identity function, but requests
n
elements at a time from the input.Behaves like the identity function, but requests
n
elements at a time from the input.scala> import cats.effect.SyncIO scala> val buf = new scala.collection.mutable.ListBuffer[String]() scala> Stream.range(0, 100).covary[SyncIO]. | evalMap(i => SyncIO { buf += s">$i"; i }). | buffer(4). | evalMap(i => SyncIO { buf += s"<$i"; i }). | take(10). | compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) scala> buf.toList res1: List[String] = List(>0, >1, >2, >3, <0, <1, <2, <3, >4, >5, >6, >7, <4, <5, <6, <7, >8, >9, >10, >11, <8, <9)
Example: -
def
bufferAll: Stream[F, O]
Behaves like the identity stream, but emits no output until the source is exhausted.
Behaves like the identity stream, but emits no output until the source is exhausted.
scala> import cats.effect.SyncIO scala> val buf = new scala.collection.mutable.ListBuffer[String]() scala> Stream.range(0, 10).covary[SyncIO]. | evalMap(i => SyncIO { buf += s">$i"; i }). | bufferAll. | evalMap(i => SyncIO { buf += s"<$i"; i }). | take(4). | compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 1, 2, 3) scala> buf.toList res1: List[String] = List(>0, >1, >2, >3, >4, >5, >6, >7, >8, >9, <0, <1, <2, <3)
Example: -
def
bufferBy(f: (O) ⇒ Boolean): Stream[F, O]
Behaves like the identity stream, but requests elements from its input in blocks that end whenever the predicate switches from true to false.
Behaves like the identity stream, but requests elements from its input in blocks that end whenever the predicate switches from true to false.
scala> import cats.effect.SyncIO scala> val buf = new scala.collection.mutable.ListBuffer[String]() scala> Stream.range(0, 10).covary[SyncIO]. | evalMap(i => SyncIO { buf += s">$i"; i }). | bufferBy(_ % 2 == 0). | evalMap(i => SyncIO { buf += s"<$i"; i }). | compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) scala> buf.toList res1: List[String] = List(>0, >1, <0, <1, >2, >3, <2, <3, >4, >5, <4, <5, >6, >7, <6, <7, >8, >9, <8, <9)
Example: -
def
changes[O2 >: O](implicit eq: Eq[O2]): Stream[F, O2]
Emits only elements that are distinct from their immediate predecessors, using natural equality for comparison.
Emits only elements that are distinct from their immediate predecessors, using natural equality for comparison.
scala> Stream(1,1,2,2,2,3,3).changes.toList res0: List[Int] = List(1, 2, 3)
Example: -
def
changesBy[O2](f: (O) ⇒ O2)(implicit eq: Eq[O2]): Stream[F, O]
Emits only elements that are distinct from their immediate predecessors according to
f
, using natural equality for comparison.Emits only elements that are distinct from their immediate predecessors according to
f
, using natural equality for comparison.Note that
f
is called for each element in the stream multiple times and hence should be fast (e.g., an accessor). It is not intended to be used for computationally intensive conversions. For such conversions, consider something like:src.map(o => (o, f(o))).changesBy(_._2).map(_._1)
scala> Stream(1,1,2,4,6,9).changesBy(_ % 2).toList res0: List[Int] = List(1, 2, 9)
Example: -
def
chunkAll: Stream[F, Chunk[O]]
Collects all output chunks in to a single chunk and emits it at the end of the source stream.
Collects all output chunks in to a single chunk and emits it at the end of the source stream. Note: if more than 2(32-1) elements are collected, this operation will fail.
scala> (Stream(1) ++ Stream(2, 3) ++ Stream(4, 5, 6)).chunkAll.toList res0: List[Chunk[Int]] = List(Chunk(1, 2, 3, 4, 5, 6))
Example: -
def
chunkLimit(n: Int): Stream[F, Chunk[O]]
Outputs chunk with a limited maximum size, splitting as necessary.
Outputs chunk with a limited maximum size, splitting as necessary.
scala> (Stream(1) ++ Stream(2, 3) ++ Stream(4, 5, 6)).chunkLimit(2).toList res0: List[Chunk[Int]] = List(Chunk(1), Chunk(2, 3), Chunk(4, 5), Chunk(6))
Example: -
def
chunkMin(n: Int, allowFewerTotal: Boolean = true): Stream[F, Chunk[O]]
Outputs chunks of size larger than N
Outputs chunks of size larger than N
Chunks from the source stream are split as necessary.
If
allowFewerTotal
is true, if the stream is smaller than N, should the elements be includedscala> (Stream(1,2) ++ Stream(3,4) ++ Stream(5,6,7)).chunkMin(3).toList res0: List[Chunk[Int]] = List(Chunk(1, 2, 3, 4), Chunk(5, 6, 7))
Example: -
def
chunkN(n: Int, allowFewer: Boolean = true): Stream[F, Chunk[O]]
Outputs chunks of size
n
.Outputs chunks of size
n
.Chunks from the source stream are split as necessary. If
allowFewer
is true, the last chunk that is emitted may have less thann
elements.Note: the emitted chunk may be a composite chunk (i.e., an instance of
Chunk.Queue
) and hence may not have O(1) lookup by index. Consider calling.map(_.compact)
if indexed lookup is important.scala> Stream(1,2,3).repeat.chunkN(2).take(5).toList res0: List[Chunk[Int]] = List(Chunk(1, 2), Chunk(3, 1), Chunk(2, 3), Chunk(1, 2), Chunk(3, 1))
Example: -
def
chunks: Stream[F, Chunk[O]]
Outputs all chunks from the source stream.
Outputs all chunks from the source stream.
scala> (Stream(1) ++ Stream(2, 3) ++ Stream(4, 5, 6)).chunks.toList res0: List[Chunk[Int]] = List(Chunk(1), Chunk(2, 3), Chunk(4, 5, 6))
Example: -
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native() @IntrinsicCandidate()
-
def
collect[O2](pf: PartialFunction[O, O2]): Stream[F, O2]
Filters and maps simultaneously.
Filters and maps simultaneously. Calls
collect
on each chunk in the stream.scala> Stream(Some(1), Some(2), None, Some(3), None, Some(4)).collect { case Some(i) => i }.toList res0: List[Int] = List(1, 2, 3, 4)
Example: -
def
collectFirst[O2](pf: PartialFunction[O, O2]): Stream[F, O2]
Emits the first element of the stream for which the partial function is defined.
Emits the first element of the stream for which the partial function is defined.
scala> Stream(None, Some(1), Some(2), None, Some(3)).collectFirst { case Some(i) => i }.toList res0: List[Int] = List(1)
Example: -
def
collectWhile[O2](pf: PartialFunction[O, O2]): Stream[F, O2]
Like collect but terminates as soon as the partial function is undefined.
Like collect but terminates as soon as the partial function is undefined.
scala> Stream(Some(1), Some(2), Some(3), None, Some(4)).collectWhile { case Some(i) => i }.toList res0: List[Int] = List(1, 2, 3)
Example: -
def
compile[F2[x] >: F[x], G[_], O2 >: O](implicit compiler: Compiler[F2, G]): CompileOps[F2, G, O2]
Gets a projection of this stream that allows converting it to an
F[..]
in a number of ways.Gets a projection of this stream that allows converting it to an
F[..]
in a number of ways.scala> import cats.effect.SyncIO scala> val prg: SyncIO[Vector[Int]] = Stream.eval(SyncIO(1)).append(Stream(2,3,4)).compile.toVector scala> prg.unsafeRunSync() res2: Vector[Int] = Vector(1, 2, 3, 4)
Example: -
def
concurrently[F2[x] >: F[x], O2](that: Stream[F2, O2])(implicit F: Concurrent[F2]): Stream[F2, O]
Runs the supplied stream in the background as elements from this stream are pulled.
Runs the supplied stream in the background as elements from this stream are pulled.
The resulting stream terminates upon termination of this stream. The background stream will be interrupted at that point. Early termination of
that
does not terminate the resulting stream.Any errors that occur in either
this
orthat
stream result in the overall stream terminating with an error.Upon finalization, the resulting stream will interrupt the background stream and wait for it to be finalized.
This method is equivalent to
this mergeHaltL that.drain
, just more efficient forthis
andthat
evaluation.scala> import cats.effect.IO, cats.effect.unsafe.implicits.global scala> val data: Stream[IO,Int] = Stream.range(1, 10).covary[IO] scala> Stream.eval(fs2.concurrent.SignallingRef[IO,Int](0)).flatMap(s => Stream(s).concurrently(data.evalMap(s.set))).flatMap(_.discrete).takeWhile(_ < 9, true).compile.last.unsafeRunSync() res0: Option[Int] = Some(9)
Example: -
def
cons[O2 >: O](c: Chunk[O2]): Stream[F, O2]
Prepends a chunk onto the front of this stream.
Prepends a chunk onto the front of this stream.
scala> Stream(1,2,3).cons(Chunk(-1, 0)).toList res0: List[Int] = List(-1, 0, 1, 2, 3)
Example: -
def
cons1[O2 >: O](o: O2): Stream[F, O2]
Prepends a single value onto the front of this stream.
Prepends a single value onto the front of this stream.
scala> Stream(1,2,3).cons1(0).toList res0: List[Int] = List(0, 1, 2, 3)
Example: -
def
consChunk[O2 >: O](c: Chunk[O2]): Stream[F, O2]
Prepends a chunk onto the front of this stream.
Prepends a chunk onto the front of this stream.
scala> Stream(1,2,3).consChunk(Chunk.from(Vector(-1, 0))).toList res0: List[Int] = List(-1, 0, 1, 2, 3)
Example: -
def
covaryAll[F2[x] >: F[x], O2 >: O]: Stream[F2, O2]
Lifts this stream to the specified effect and output types.
Lifts this stream to the specified effect and output types.
scala> import cats.effect.IO scala> Stream.empty.covaryAll[IO,Int] res0: Stream[IO,Int] = Stream(..)
Example: -
def
covaryOutput[O2 >: O]: Stream[F, O2]
Lifts this stream to the specified output type.
Lifts this stream to the specified output type.
scala> Stream(Some(1), Some(2), Some(3)).covaryOutput[Option[Int]] res0: Stream[Pure,Option[Int]] = Stream(..)
Example: -
def
debounce[F2[x] >: F[x]](d: FiniteDuration)(implicit F: Temporal[F2]): Stream[F2, O]
Debounce the stream with a minimum period of
d
between each element.Debounce the stream with a minimum period of
d
between each element.Use-case: if this is a stream of updates about external state, we may want to refresh (side-effectful) once every 'd' milliseconds, and every time we refresh we only care about the latest update.
- returns
A stream whose values is an in-order, not necessarily strict subsequence of this stream, and whose evaluation will force a delay
d
between emitting each element. The exact subsequence would depend on the chunk structure of this stream, and the timing they arrive.
scala> import scala.concurrent.duration._, cats.effect.IO, cats.effect.unsafe.implicits.global scala> val s = Stream(1, 2, 3) ++ Stream.sleep_[IO](500.millis) ++ Stream(4, 5) ++ Stream.sleep_[IO](10.millis) ++ Stream(6) scala> val s2 = s.debounce(100.milliseconds) scala> s2.compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(3, 6)
Example: -
def
debug[O2 >: O](formatter: (O2) ⇒ String = (o2: O2) => o2.toString, logger: (String) ⇒ Unit = println(_)): Stream[F, O]
Logs the elements of this stream as they are pulled.
Logs the elements of this stream as they are pulled.
By default,
toString
is called on each element and the result is printed to standard out. To change formatting, supply a value for theformatter
param. To change the destination, supply a value for thelogger
param.This method does not change the chunk structure of the stream. To debug the chunk structure, see debugChunks.
Logging is not done in
F
because this operation is intended for debugging, including pure streams.scala> Stream(1, 2).append(Stream(3, 4)).debug(o => s"a: $o").toList a: 1 a: 2 a: 3 a: 4 res0: List[Int] = List(1, 2, 3, 4)
Example: -
def
debugChunks[O2 >: O](formatter: (Chunk[O2]) ⇒ String = (os: Chunk[O2]) => os.toString, logger: (String) ⇒ Unit = println(_)): Stream[F, O]
Like debug but logs chunks as they are pulled instead of individual elements.
Like debug but logs chunks as they are pulled instead of individual elements.
scala> Stream(1, 2, 3).append(Stream(4, 5, 6)).debugChunks(c => s"a: $c").buffer(2).debugChunks(c => s"b: $c").toList a: Chunk(1, 2, 3) b: Chunk(1, 2) a: Chunk(4, 5, 6) b: Chunk(3, 4) b: Chunk(5, 6) res0: List[Int] = List(1, 2, 3, 4, 5, 6)
Example: -
def
delayBy[F2[x] >: F[x]](d: FiniteDuration)(implicit arg0: Temporal[F2]): Stream[F2, O]
Returns a stream that when run, sleeps for duration
d
and then pulls from this stream.Returns a stream that when run, sleeps for duration
d
and then pulls from this stream.Alias for
sleep_[F](d) ++ this
. -
def
delete(p: (O) ⇒ Boolean): Stream[F, O]
Skips the first element that matches the predicate.
Skips the first element that matches the predicate.
scala> Stream.range(1, 10).delete(_ % 2 == 0).toList res0: List[Int] = List(1, 3, 4, 5, 6, 7, 8, 9)
Example: -
def
drain: Stream[F, Nothing]
Removes all output values from this stream.
Removes all output values from this stream.
Often used with
merge
to run one side of the merge for its effect while getting outputs from the opposite side of the merge.scala> import cats.effect.SyncIO scala> Stream.eval(SyncIO(println("x"))).drain.compile.toVector.unsafeRunSync() res0: Vector[Nothing] = Vector()
Example: -
def
drop(n: Long): Stream[F, O]
Drops
n
elements of the input, then echoes the rest.Drops
n
elements of the input, then echoes the rest.scala> Stream.range(0,10).drop(5).toList res0: List[Int] = List(5, 6, 7, 8, 9)
Example: -
def
dropLast: Stream[F, O]
Drops the last element.
Drops the last element.
scala> Stream.range(0,10).dropLast.toList res0: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8)
Example: -
def
dropLastIf(p: (O) ⇒ Boolean): Stream[F, O]
Drops the last element if the predicate evaluates to true.
Drops the last element if the predicate evaluates to true.
scala> Stream.range(0,10).dropLastIf(_ > 5).toList res0: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8)
Example: -
def
dropRight(n: Int): Stream[F, O]
Outputs all but the last
n
elements of the input.Outputs all but the last
n
elements of the input.This is a pure stream operation: if
s
is a finite pure stream, thens.dropRight(n).toList
is equal tothis.toList.reverse.drop(n).reverse
.scala> Stream.range(0,10).dropRight(5).toList res0: List[Int] = List(0, 1, 2, 3, 4)
Example: -
def
dropThrough(p: (O) ⇒ Boolean): Stream[F, O]
Like dropWhile, but drops the first value which tests false.
Like dropWhile, but drops the first value which tests false.
scala> Stream.range(0,10).dropThrough(_ != 4).toList res0: List[Int] = List(5, 6, 7, 8, 9)
Pure: if
this
is a finite pure stream, thenthis.dropThrough(p).toList
is equal tothis.toList.dropWhile(p).drop(1)
Example: -
def
dropWhile(p: (O) ⇒ Boolean): Stream[F, O]
Drops elements from the head of this stream until the supplied predicate returns false.
Drops elements from the head of this stream until the supplied predicate returns false.
scala> Stream.range(0,10).dropWhile(_ != 4).toList res0: List[Int] = List(4, 5, 6, 7, 8, 9)
Pure this operation maps directly to
List.dropWhile
Example: -
def
either[F2[x] >: F[x], O2](that: Stream[F2, O2])(implicit arg0: Concurrent[F2]): Stream[F2, Either[O, O2]]
Like
merge
, but tags each output with the branch it came from.Like
merge
, but tags each output with the branch it came from.scala> import scala.concurrent.duration._, cats.effect.IO, cats.effect.unsafe.implicits.global scala> val s1 = Stream.awakeEvery[IO](1000.millis).scan(0)((acc, _) => acc + 1) scala> val s = s1.either(Stream.sleep_[IO](500.millis) ++ s1).take(10) scala> s.take(10).compile.toVector.unsafeRunSync() res0: Vector[Either[Int,Int]] = Vector(Left(0), Right(0), Left(1), Right(1), Left(2), Right(2), Left(3), Right(3), Left(4), Right(4))
Example: -
def
enqueueNoneTerminated[F2[x] >: F[x], O2 >: O](queue: QueueSink[F2, Option[O2]]): Stream[F2, Nothing]
Enqueues the elements of this stream to the supplied queue and enqueues
None
when this stream terminates. -
def
enqueueNoneTerminatedChunks[F2[x] >: F[x], O2 >: O](queue: QueueSink[F2, Option[Chunk[O2]]]): Stream[F2, Nothing]
Enqueues the chunks of this stream to the supplied queue and enqueues
None
when this stream terminates. -
def
enqueueUnterminated[F2[x] >: F[x], O2 >: O](queue: QueueSink[F2, O2]): Stream[F2, Nothing]
Enqueues the elements of this stream to the supplied queue.
-
def
enqueueUnterminatedChunks[F2[x] >: F[x], O2 >: O](queue: QueueSink[F2, Chunk[O2]]): Stream[F2, Nothing]
Enqueues the chunks of this stream to the supplied queue.
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
evalFilter[F2[x] >: F[x]](f: (O) ⇒ F2[Boolean]): Stream[F2, O]
Like
filter
, but allows filtering based on an effect.Like
filter
, but allows filtering based on an effect.Note: The result Stream will consist of chunks that are empty or 1-element-long. If you want to operate on chunks after using it, consider buffering, e.g. by using buffer.
-
def
evalFilterAsync[F2[x] >: F[x]](maxConcurrent: Int)(f: (O) ⇒ F2[Boolean])(implicit arg0: Concurrent[F2]): Stream[F2, O]
Like
filter
, but allows filtering based on an effect, with up tomaxConcurrent
concurrently running effects.Like
filter
, but allows filtering based on an effect, with up tomaxConcurrent
concurrently running effects. The ordering of emitted elements is unchanged. -
def
evalFilterNot[F2[x] >: F[x]](f: (O) ⇒ F2[Boolean]): Stream[F2, O]
Like
filterNot
, but allows filtering based on an effect.Like
filterNot
, but allows filtering based on an effect.Note: The result Stream will consist of chunks that are empty or 1-element-long. If you want to operate on chunks after using it, consider buffering, e.g. by using buffer.
-
def
evalFilterNotAsync[F2[x] >: F[x]](maxConcurrent: Int)(f: (O) ⇒ F2[Boolean])(implicit arg0: Concurrent[F2]): Stream[F2, O]
Like
filterNot
, but allows filtering based on an effect, with up tomaxConcurrent
concurrently running effects.Like
filterNot
, but allows filtering based on an effect, with up tomaxConcurrent
concurrently running effects. The ordering of emitted elements is unchanged. -
def
evalMap[F2[x] >: F[x], O2](f: (O) ⇒ F2[O2]): Stream[F2, O2]
Alias for
flatMap(o => Stream.eval(f(o)))
.Alias for
flatMap(o => Stream.eval(f(o)))
.scala> import cats.effect.SyncIO scala> Stream(1,2,3,4).evalMap(i => SyncIO(println(i))).compile.drain.unsafeRunSync() res0: Unit = ()
Note this operator will de-chunk the stream back into chunks of size 1, which has performance implications. For maximum performance,
evalMapChunk
is available, however, with caveats.
Example: -
def
evalMapAccumulate[F2[x] >: F[x], S, O2](s: S)(f: (S, O) ⇒ F2[(S, O2)]): Stream[F2, (S, O2)]
Like
Stream#mapAccumulate
, but accepts a function returning anF[_]
.Like
Stream#mapAccumulate
, but accepts a function returning anF[_]
.scala> import cats.effect.SyncIO scala> Stream(1,2,3,4).covary[SyncIO].evalMapAccumulate(0)((acc,i) => SyncIO((i, acc + i))).compile.toVector.unsafeRunSync() res0: Vector[(Int, Int)] = Vector((1,1), (2,3), (3,5), (4,7))
Example: -
def
evalMapChunk[F2[x] >: F[x], O2](f: (O) ⇒ F2[O2])(implicit arg0: Applicative[F2]): Stream[F2, O2]
Like
evalMap
, but operates on chunks for performance.Like
evalMap
, but operates on chunks for performance. This means this operator is not lazy on every single element, rather on the chunks.For instance,
evalMap
would only print twice in the follow example (note thetake(2)
):scala> import cats.effect.SyncIO scala> Stream(1,2,3,4).evalMap(i => SyncIO(println(i))).take(2).compile.drain.unsafeRunSync() res0: Unit = ()
But with
evalMapChunk
, it will print 4 times: , scala> Stream(1,2,3,4).evalMapChunk(i => SyncIO(println(i))).take(2).compile.drain.unsafeRunSync() res0: Unit = ()
Examples: -
def
evalMapFilter[F2[x] >: F[x], O2](f: (O) ⇒ F2[Option[O2]]): Stream[F2, O2]
Effectfully maps and filters the elements of the stream depending on the optionality of the result of the application of the effectful function
f
.Effectfully maps and filters the elements of the stream depending on the optionality of the result of the application of the effectful function
f
.scala> import cats.effect.SyncIO, cats.syntax.all._ scala> Stream(1, 2, 3, 4, 5).evalMapFilter(n => SyncIO((n * 2).some.filter(_ % 4 == 0))).compile.toList.unsafeRunSync() res0: List[Int] = List(4, 8)
Example: -
def
evalScan[F2[x] >: F[x], O2](z: O2)(f: (O2, O) ⇒ F2[O2]): Stream[F2, O2]
Like
Stream#scan
, but accepts a function returning anF[_]
.Like
Stream#scan
, but accepts a function returning anF[_]
.scala> import cats.effect.SyncIO scala> Stream(1,2,3,4).covary[SyncIO].evalScan(0)((acc,i) => SyncIO(acc + i)).compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 1, 3, 6, 10)
Example: -
def
evalTap[F2[x] >: F[x], O2](f: (O) ⇒ F2[O2]): Stream[F2, O]
Like
observe
but observes with a functionO => F[O2]
instead of a pipe.Like
observe
but observes with a functionO => F[O2]
instead of a pipe. Not as powerful asobserve
since not all pipes can be represented byO => F[O2]
, but much faster. Alias forevalMap(o => f(o).as(o))
. -
def
evalTapChunk[F2[x] >: F[x], O2](f: (O) ⇒ F2[O2])(implicit arg0: Applicative[F2]): Stream[F2, O]
Alias for
evalMapChunk(o => f(o).as(o))
. -
def
exists(p: (O) ⇒ Boolean): Stream[F, Boolean]
Emits
true
as soon as a matching element is received, elsefalse
if no input matches.Emits
true
as soon as a matching element is received, elsefalse
if no input matches. Pure: this operation maps toList.exists
- returns
Either a singleton stream, or a
never
stream.- If
this
is a finite stream, the result is a singleton stream, yielding a single boolean value. - If
this
is empty, the result is a singleton stream, yielding atrue
value. - If
this
is a non-terminating stream which contains a value matching the predicate, the result is a singleton stream containingtrue
. - If
this
is a non-terminating stream which never contains a value matching the predicate, the result is anever
stream.
- If
scala> Stream.range(0,10).exists(_ == 4).toList res0: List[Boolean] = List(true) scala> Stream.range(0,10).exists(_ == 10).toList res1: List[Boolean] = List(false)
Example: -
def
filter(p: (O) ⇒ Boolean): Stream[F, O]
Emits only inputs which match the supplied predicate.
Emits only inputs which match the supplied predicate.
This is a pure operation, that projects directly into
List.filter
scala> Stream.range(0,10).filter(_ % 2 == 0).toList res0: List[Int] = List(0, 2, 4, 6, 8)
Example: -
def
filterNot(p: (O) ⇒ Boolean): Stream[F, O]
Emits only inputs which do not match the supplied predicate.
-
def
filterWithPrevious(f: (O, O) ⇒ Boolean): Stream[F, O]
Like
filter
, but the predicatef
depends on the previously emitted and current elements.Like
filter
, but the predicatef
depends on the previously emitted and current elements.scala> Stream(1, 9, 5, 6, 7, 8, 9, 10).filterWithPrevious((previous, current) => previous < current).toList res0: List[Int] = List(1, 9, 10)
Example: -
def
find(f: (O) ⇒ Boolean): Stream[F, O]
Emits the first input (if any) which matches the supplied predicate.
Emits the first input (if any) which matches the supplied predicate.
scala> Stream.range(1,10).find(_ % 2 == 0).toList res0: List[Int] = List(2)
Pure if
s
is a finite pure stream,s.find(p).toList
is equal tos.toList.find(p).toList
, where the secondtoList
is to turnOption
intoList
.
Example: -
def
flatMap[F2[x] >: F[x], O2](f: (O) ⇒ Stream[F2, O2])(implicit ev: NotGiven[<:<[O, Nothing]]): Stream[F2, O2]
Creates a stream whose elements are generated by applying
f
to each output of the source stream and concatenated all of the results.Creates a stream whose elements are generated by applying
f
to each output of the source stream and concatenated all of the results.- Annotations
- @nowarn()
scala> Stream(1, 2, 3).flatMap { i => Stream.chunk(Chunk.from(List.fill(i)(i))) }.toList res0: List[Int] = List(1, 2, 2, 3, 3, 3)
Example: -
def
flatten[F2[x] >: F[x], O2](implicit ev: <:<[O, Stream[F2, O2]]): Stream[F2, O2]
Flattens a stream of streams in to a single stream by concatenating each stream.
Flattens a stream of streams in to a single stream by concatenating each stream. See
parJoin
andparJoinUnbounded
for concurrent flattening of 'n' streams. -
def
fold[O2](z: O2)(f: (O2, O) ⇒ O2): Stream[F, O2]
Folds all inputs using an initial value
z
and supplied binary operator, and emits a single element stream.Folds all inputs using an initial value
z
and supplied binary operator, and emits a single element stream.scala> Stream(1, 2, 3, 4, 5).fold(0)(_ + _).toList res0: List[Int] = List(15)
Example: -
def
fold1[O2 >: O](f: (O2, O2) ⇒ O2): Stream[F, O2]
Folds all inputs using the supplied binary operator, and emits a single-element stream, or the empty stream if the input is empty, or the never stream if the input is non-terminating.
Folds all inputs using the supplied binary operator, and emits a single-element stream, or the empty stream if the input is empty, or the never stream if the input is non-terminating.
scala> Stream(1, 2, 3, 4, 5).fold1(_ + _).toList res0: List[Int] = List(15)
Example: -
def
foldMap[O2](f: (O) ⇒ O2)(implicit O2: Monoid[O2]): Stream[F, O2]
Alias for
map(f).foldMonoid
.Alias for
map(f).foldMonoid
.scala> Stream(1, 2, 3, 4, 5).foldMap(_ => 1).toList res0: List[Int] = List(5)
Example: -
def
foldMonoid[O2 >: O](implicit O: Monoid[O2]): Stream[F, O2]
Folds this stream with the monoid for
O
.Folds this stream with the monoid for
O
.- returns
Either a singleton stream or a
never
stream:- If
this
is a finite stream, the result is a singleton stream. Ifthis
is empty, that value is themempty
of the instance ofMonoid
. - If
this
is a non-terminating stream, and no matter if it yields any value, then the result is equivalent to theStream.never
: it never terminates nor yields any value.
- If
scala> Stream(1, 2, 3, 4, 5).foldMonoid.toList res0: List[Int] = List(15)
Example: -
def
forall(p: (O) ⇒ Boolean): Stream[F, Boolean]
Emits
false
and halts as soon as a non-matching element is received; or emits a singletrue
value if it reaches the stream end and every input before that matches the predicate; or hangs without emitting values if the input is infinite and all inputs match the predicate.Emits
false
and halts as soon as a non-matching element is received; or emits a singletrue
value if it reaches the stream end and every input before that matches the predicate; or hangs without emitting values if the input is infinite and all inputs match the predicate.- returns
Either a singleton or a never stream: - If
this
yields an elementx
for which¬ p(x)
, then a singleton stream with the valuefalse
. Pulling from the resultg performs all the effects needed until reaching the counterexamplex
. - Ifthis
is a finite stream with no counterexamples ofp
, then a singleton stream with thetrue
value. Pulling from the it will perform all effects ofthis
. - Ifthis
is an infinite stream and all its the elements satisfyp
, then the result is anever
stream. Pulling from that stream will pull all effects fromthis
.
scala> Stream(1, 2, 3, 4, 5).forall(_ < 10).toList res0: List[Boolean] = List(true)
Example: -
def
foreach[F2[x] >: F[x]](f: (O) ⇒ F2[Unit]): Stream[F2, Nothing]
Like
evalMap
but discards the result of evaluation, resulting in a stream with no elements.Like
evalMap
but discards the result of evaluation, resulting in a stream with no elements.scala> import cats.effect.SyncIO scala> Stream(1,2,3,4).foreach(i => SyncIO(println(i))).compile.drain.unsafeRunSync() res0: Unit = ()
Example: -
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
-
def
groupAdjacentBy[O2](f: (O) ⇒ O2)(implicit eq: Eq[O2]): Stream[F, (O2, Chunk[O])]
Partitions the input into a stream of chunks according to a discriminator function.
Partitions the input into a stream of chunks according to a discriminator function.
Each chunk in the source stream is grouped using the supplied discriminator function and the results of the grouping are emitted each time the discriminator function changes values.
Note: there is no limit to how large a group can become. To limit the group size, use groupAdjacentByLimit.
scala> Stream("Hello", "Hi", "Greetings", "Hey").groupAdjacentBy(_.head).toList.map { case (k,vs) => k -> vs.toList } res0: List[(Char,List[String])] = List((H,List(Hello, Hi)), (G,List(Greetings)), (H,List(Hey)))
Example: -
def
groupAdjacentByLimit[O2](limit: Int)(f: (O) ⇒ O2)(implicit eq: Eq[O2]): Stream[F, (O2, Chunk[O])]
Like groupAdjacentBy but limits the size of emitted chunks.
Like groupAdjacentBy but limits the size of emitted chunks.
scala> Stream.range(0, 12).groupAdjacentByLimit(3)(_ / 4).toList res0: List[(Int,Chunk[Int])] = List((0,Chunk(0, 1, 2)), (0,Chunk(3)), (1,Chunk(4, 5, 6)), (1,Chunk(7)), (2,Chunk(8, 9, 10)), (2,Chunk(11)))
Example: -
def
groupWithin[F2[x] >: F[x]](chunkSize: Int, timeout: FiniteDuration)(implicit F: Temporal[F2]): Stream[F2, Chunk[O]]
Splits this stream into a stream of chunks of elements, such that 1.
Splits this stream into a stream of chunks of elements, such that 1. each chunk in the output has at most
outputSize
elements, and 2. the concatenation of those chunks, which is obtained by callingunchunks
, yields the same element sequence as this stream.As
this
stream emits input elements, the result stream them in a waiting buffer, until it has enough elements to emit next chunk.To avoid holding input elements for too long, this method takes a
timeout
. This timeout is reset after each output chunk is emitted.When the timeout expires, if the buffer contains any elements, then all elements in the buffer are emitted in an output chunk, even if there are fewer than
chunkSize
elements, and the timeout is reset.However, if the buffer is empty when the
timeout
expires, then the output stream enters into a "timed out" state. From it, as soon asthis
stream emits the next chunk of input, the resulting stream will emit its next output chunk and reset timeout again. If that input chunk is shorter than thechunkSize
, it is emitted whole. Otherwise, only the firstchunkSize
elements are emitted, and the rest are put in the buffer.When the input stream terminates, any accumulated elements are emitted immediately in a chunk, even if
timeout
has not expired.- chunkSize
the maximum size of chunks emitted by resulting stream.
- timeout
maximum time that input elements are held in the buffer before being emitted by the resulting stream.
-
def
handleErrorWith[F2[x] >: F[x], O2 >: O](h: (Throwable) ⇒ Stream[F2, O2]): Stream[F2, O2]
If
this
terminates withStream.raiseError(e)
, invokeh(e)
.If
this
terminates withStream.raiseError(e)
, invokeh(e)
.scala> import cats.effect.SyncIO scala> Stream(1, 2, 3).append(Stream.raiseError[SyncIO](new RuntimeException)).handleErrorWith(_ => Stream(0)).compile.toList.unsafeRunSync() res0: List[Int] = List(1, 2, 3, 0)
Example: -
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
-
def
head: Stream[F, O]
Emits the first element of this stream (if non-empty) and then halts.
Emits the first element of this stream (if non-empty) and then halts.
scala> Stream(1, 2, 3).head.toList res0: List[Int] = List(1)
Example: -
def
hold[F2[x] >: F[x], O2 >: O](initial: O2)(implicit arg0: Concurrent[F2]): Stream[F2, Signal[F2, O2]]
Converts a discrete stream to a signal.
Converts a discrete stream to a signal. Returns a single-element stream.
Resulting signal is initially
initial
, and is updated with latest value produced bysource
. If the source stream is empty, the resulting signal will always beinitial
. -
def
hold1[F2[x] >: F[x], O2 >: O](implicit arg0: Concurrent[F2]): Stream[F2, Signal[F2, O2]]
Like hold but does not require an initial value.
Like hold but does not require an initial value. The signal is not emitted until the initial value is emitted from this stream
-
def
hold1Resource[F2[x] >: F[x], O2 >: O](implicit arg0: Concurrent[F2]): Resource[F2, Signal[F2, O2]]
Like hold1 but returns a
Resource
rather than a single element stream. -
def
holdOption[F2[x] >: F[x], O2 >: O](implicit arg0: Concurrent[F2]): Stream[F2, Signal[F2, Option[O2]]]
Like hold but does not require an initial value, and hence all output elements are wrapped in
Some
. -
def
holdOptionResource[F2[x] >: F[x], O2 >: O](implicit arg0: Concurrent[F2]): Resource[F2, Signal[F2, Option[O2]]]
Like holdResource but does not require an initial value, and hence all output elements are wrapped in
Some
. -
def
holdResource[F2[x] >: F[x], O2 >: O](initial: O2)(implicit arg0: Concurrent[F2]): Resource[F2, Signal[F2, O2]]
Like hold but returns a
Resource
rather than a single element stream. -
def
ifEmpty[F2[x] >: F[x], O2 >: O](fallback: ⇒ Stream[F2, O2]): Stream[F2, O2]
Falls back to the supplied stream if this stream finishes without emitting any elements.
Falls back to the supplied stream if this stream finishes without emitting any elements. Note: fallback occurs any time stream evaluation finishes without emitting, even when effects have been evaluated.
scala> Stream.empty.ifEmpty(Stream(1, 2, 3)).toList res0: List[Int] = List(1, 2, 3) scala> Stream.exec(cats.effect.SyncIO(println("Hello"))).ifEmpty(Stream(1, 2, 3)).compile.toList.unsafeRunSync() res1: List[Int] = List(1, 2, 3)
Example: -
def
ifEmptyEmit[O2 >: O](o: ⇒ O2): Stream[F, O2]
Emits the supplied value if this stream finishes without emitting any elements.
Emits the supplied value if this stream finishes without emitting any elements. Note: fallback occurs any time stream evaluation finishes without emitting, even when effects have been evaluated.
scala> Stream.empty.ifEmptyEmit(0).toList res0: List[Int] = List(0)
Example: -
def
interleave[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2]): Stream[F2, O2]
Deterministically interleaves elements, starting on the left, terminating when the end of either branch is reached naturally.
Deterministically interleaves elements, starting on the left, terminating when the end of either branch is reached naturally.
scala> Stream(1, 2, 3).interleave(Stream(4, 5, 6, 7)).toList res0: List[Int] = List(1, 4, 2, 5, 3, 6)
Example: -
def
interleaveAll[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2]): Stream[F2, O2]
Deterministically interleaves elements, starting on the left, terminating when the ends of both branches are reached naturally.
Deterministically interleaves elements, starting on the left, terminating when the ends of both branches are reached naturally.
scala> Stream(1, 2, 3).interleaveAll(Stream(4, 5, 6, 7)).toList res0: List[Int] = List(1, 4, 2, 5, 3, 6, 7)
Example: -
def
interleaveOrdered[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2])(implicit arg0: Order[O2]): Stream[F2, O2]
Given two sorted streams emits a single sorted stream, like in merge-sort.
Given two sorted streams emits a single sorted stream, like in merge-sort. For entries that are considered equal by the Order, left stream element is emitted first. Note: both this and another streams MUST BE ORDERED already
scala> Stream(1, 2, 5, 6).interleaveOrdered(Stream(0, 2, 3, 4)).toList res0: List[Int] = List(0, 1, 2, 2, 3, 4, 5, 6)
Example: -
def
interruptAfter[F2[x] >: F[x]](duration: FiniteDuration)(implicit arg0: Temporal[F2]): Stream[F2, O]
Interrupts this stream after the specified duration has passed.
-
def
interruptScope: Stream[F, O]
Creates a scope that may be interrupted by calling scope#interrupt.
-
def
interruptWhen[F2[x] >: F[x]](haltOnSignal: F2[Either[Throwable, Unit]]): Stream[F2, O]
Interrupts the stream, when
haltOnSignal
finishes its evaluation. -
def
interruptWhen[F2[x] >: F[x]](haltWhenTrue: Signal[F2, Boolean])(implicit arg0: Concurrent[F2]): Stream[F2, O]
Alias for
interruptWhen(haltWhenTrue.discrete)
. -
def
interruptWhen[F2[x] >: F[x]](haltWhenTrue: Deferred[F2, Either[Throwable, Unit]]): Stream[F2, O]
Alias for
interruptWhen(haltWhenTrue.get)
. -
def
interruptWhen[F2[x] >: F[x]](haltWhenTrue: Stream[F2, Boolean])(implicit F: Concurrent[F2]): Stream[F2, O]
Ties this stream to the given
haltWhenTrue
stream.Ties this stream to the given
haltWhenTrue
stream. The resulting stream performs all the effects and emits all the outputs fromthis
stream (the fore), until the moment that thehaltWhenTrue
stream ends, be it by emittingtrue
, error, or cancellation.The
haltWhenTrue
stream is compiled and drained, asynchronously in the background, until the moment it emits a valuetrue
or raises an error. This halts as soon as either branch halts.If the
haltWhenTrue
stream ends by raising an error, the resulting stream rethrows that same error. If thehaltWhenTrue
stream is cancelled, then the resulting stream is interrupted (without cancellation).Consider using the overload that takes a
Signal
,Deferred
orF[Either[Throwable, Unit]]
. -
def
intersperse[O2 >: O](separator: O2): Stream[F, O2]
Emits the specified separator between every pair of elements in the source stream.
Emits the specified separator between every pair of elements in the source stream.
scala> Stream(1, 2, 3, 4, 5).intersperse(0).toList res0: List[Int] = List(1, 0, 2, 0, 3, 0, 4, 0, 5)
This method preserves the Chunking structure of
this
stream.
Example: -
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
def
last: Stream[F, Option[O]]
Returns the last element of this stream, if non-empty.
Returns the last element of this stream, if non-empty.
scala> Stream(1, 2, 3).last.toList res0: List[Option[Int]] = List(Some(3))
Example: -
def
lastOr[O2 >: O](fallback: ⇒ O2): Stream[F, O2]
Returns the last element of this stream, if non-empty, otherwise the supplied
fallback
value.Returns the last element of this stream, if non-empty, otherwise the supplied
fallback
value.scala> Stream(1, 2, 3).lastOr(0).toList res0: List[Int] = List(3) scala> Stream.empty.lastOr(0).toList res1: List[Int] = List(0)
Example: -
def
limit[F2[x] >: F[x]](n: Long)(implicit rt: RaiseThrowable[F2]): Stream[F2, O]
Emits the first
n
elements of this stream, raising an IllegalStateException if there are more elements. -
def
map[O2](f: (O) ⇒ O2): Stream[F, O2]
Applies the specified pure function to each input and emits the result.
Applies the specified pure function to each input and emits the result.
scala> Stream("Hello", "World!").map(_.size).toList res0: List[Int] = List(5, 6)
Example: -
def
mapAccumulate[S, O2](init: S)(f: (S, O) ⇒ (S, O2)): Stream[F, (S, O2)]
Maps a running total according to
S
and the input with the functionf
.Maps a running total according to
S
and the input with the functionf
.scala> Stream("Hello", "World").mapAccumulate(0)((l, s) => (l + s.length, s.head)).toVector res0: Vector[(Int, Char)] = Vector((5,H), (10,W))
Example: -
def
mapAsync[F2[x] >: F[x], O2](maxConcurrent: Int)(f: (O) ⇒ F2[O2])(implicit arg0: Concurrent[F2]): Stream[F2, O2]
Alias for parEvalMap.
-
def
mapAsyncUnordered[F2[x] >: F[x], O2](maxConcurrent: Int)(f: (O) ⇒ F2[O2])(implicit arg0: Concurrent[F2]): Stream[F2, O2]
Alias for parEvalMapUnordered.
-
def
mapChunks[O2](f: (Chunk[O]) ⇒ Chunk[O2]): Stream[F, O2]
Applies the specified pure function to each chunk in this stream.
Applies the specified pure function to each chunk in this stream.
scala> Stream(1, 2, 3).append(Stream(4, 5, 6)).mapChunks { c => val ints = c.toArraySlice; for (i <- 0 until ints.values.size) ints.values(i) = 0; ints }.toList res0: List[Int] = List(0, 0, 0, 0, 0, 0)
Example: -
def
mask: Stream[F, O]
Behaves like the identity function but halts the stream on an error and does not return the error.
Behaves like the identity function but halts the stream on an error and does not return the error.
scala> import cats.effect.SyncIO scala> (Stream(1,2,3) ++ Stream.raiseError[SyncIO](new RuntimeException) ++ Stream(4, 5, 6)).mask.compile.toList.unsafeRunSync() res0: List[Int] = List(1, 2, 3)
Example: -
def
merge[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2])(implicit F: Concurrent[F2]): Stream[F2, O2]
Interleaves the two inputs nondeterministically.
Interleaves the two inputs nondeterministically. The output stream halts after BOTH
s1
ands2
terminate normally, or in the event of an uncaught failure on eithers1
ors2
. Has the property thatmerge(Stream.empty, s) == s
andmerge(raiseError(e), s)
will eventually terminate withraiseError(e)
, possibly after emitting some elements ofs
first.The implementation always tries to pull one chunk from each side before waiting for it to be consumed by resulting stream. As such, there may be up to two chunks (one from each stream) waiting to be processed while the resulting stream is processing elements.
Also note that if either side produces empty chunk, the processing on that side continues, w/o downstream requiring to consume result.
If either side does not emit anything (i.e. as result of drain) that side will continue to run even when the resulting stream did not ask for more data.
Note that even when this is equivalent to
Stream(this, that).parJoinUnbounded
, this implementation is little more efficientscala> import scala.concurrent.duration._, cats.effect.IO, cats.effect.unsafe.implicits.global scala> val s1 = Stream.awakeEvery[IO](500.millis).scan(0)((acc, _) => acc + 1) scala> val s = s1.merge(Stream.sleep_[IO](250.millis) ++ s1) scala> s.take(6).compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 0, 1, 1, 2, 2)
Example: -
def
mergeHaltBoth[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2])(implicit arg0: Concurrent[F2]): Stream[F2, O2]
Like
merge
, but halts as soon as _either_ branch halts. -
def
mergeHaltL[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2])(implicit arg0: Concurrent[F2]): Stream[F2, O2]
Like
merge
, but halts as soon as thes1
branch halts.Like
merge
, but halts as soon as thes1
branch halts.Note: it is *not* guaranteed that the last element of the stream will come from
s1
. -
def
mergeHaltR[F2[x] >: F[x], O2 >: O](that: Stream[F2, O2])(implicit arg0: Concurrent[F2]): Stream[F2, O2]
Like
merge
, but halts as soon as thes2
branch halts.Like
merge
, but halts as soon as thes2
branch halts.Note: it is *not* guaranteed that the last element of the stream will come from
s2
. -
def
metered[F2[x] >: F[x]](rate: FiniteDuration)(implicit arg0: Temporal[F2]): Stream[F2, O]
Throttles the stream to the specified
rate
. -
def
meteredStartImmediately[F2[x] >: F[x]](rate: FiniteDuration)(implicit arg0: Temporal[F2]): Stream[F2, O]
Provides the same functionality as metered but begins immediately instead of waiting for
rate
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
noneTerminate: Stream[F, Option[O]]
Emits each output wrapped in a
Some
and emits aNone
at the end of the stream.Emits each output wrapped in a
Some
and emits aNone
at the end of the stream.s.noneTerminate.unNoneTerminate == s
scala> Stream(1,2,3).noneTerminate.toList res0: List[Option[Int]] = List(Some(1), Some(2), Some(3), None)
Example: -
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
-
def
onComplete[F2[x] >: F[x], O2 >: O](s2: ⇒ Stream[F2, O2]): Stream[F2, O2]
Run
s2
afterthis
, regardless of errors duringthis
, then reraise any errors encountered duringthis
.Run
s2
afterthis
, regardless of errors duringthis
, then reraise any errors encountered duringthis
.Note: this should *not* be used for resource cleanup! Use
bracket
oronFinalize
instead.scala> Stream(1, 2, 3).onComplete(Stream(4, 5)).toList res0: List[Int] = List(1, 2, 3, 4, 5)
Example: -
def
onFinalize[F2[x] >: F[x]](f: F2[Unit])(implicit F2: Applicative[F2]): Stream[F2, O]
Runs the supplied effectful action at the end of this stream, regardless of how the stream terminates.
-
def
onFinalizeCase[F2[x] >: F[x]](f: (ExitCase) ⇒ F2[Unit])(implicit F2: Applicative[F2]): Stream[F2, O]
Like onFinalize but provides the reason for finalization as an
ExitCase[Throwable]
. -
def
onFinalizeCaseWeak[F2[x] >: F[x]](f: (ExitCase) ⇒ F2[Unit])(implicit F2: Applicative[F2]): Stream[F2, O]
Like onFinalizeCase but does not introduce a scope, allowing finalization to occur after subsequent appends or other scope-preserving transformations.
Like onFinalizeCase but does not introduce a scope, allowing finalization to occur after subsequent appends or other scope-preserving transformations.
Scopes can be manually introduced via scope if desired.
See onFinalizeWeak for more details on semantics.
-
def
onFinalizeWeak[F2[x] >: F[x]](f: F2[Unit])(implicit F2: Applicative[F2]): Stream[F2, O]
Like onFinalize but does not introduce a scope, allowing finalization to occur after subsequent appends or other scope-preserving transformations.
Like onFinalize but does not introduce a scope, allowing finalization to occur after subsequent appends or other scope-preserving transformations.
Scopes can be manually introduced via scope if desired.
Example use case:
a.concurrently(b).onFinalizeWeak(f).compile.resource.use(g)
In this example, use ofonFinalize
would result inb
shutting down beforeg
is run, becauseonFinalize
creates a scope, whose lifetime is extended over the compiled resource. By usingonFinalizeWeak
instead,f
is attached to the scope governingconcurrently
. -
def
parEvalMap[F2[x] >: F[x], O2](maxConcurrent: Int)(f: (O) ⇒ F2[O2])(implicit F: Concurrent[F2]): Stream[F2, O2]
Like Stream#evalMap, but will evaluate effects in parallel, emitting the results downstream in the same order as the input stream.
Like Stream#evalMap, but will evaluate effects in parallel, emitting the results downstream in the same order as the input stream. The number of concurrent effects is limited by the
maxConcurrent
parameter.See Stream#parEvalMapUnordered if there is no requirement to retain the order of the original stream.
scala> import cats.effect.IO, cats.effect.unsafe.implicits.global scala> Stream(1,2,3,4).covary[IO].parEvalMap(2)(i => IO(println(i))).compile.drain.unsafeRunSync() res0: Unit = ()
Example: -
def
parEvalMapUnbounded[F2[x] >: F[x], O2](f: (O) ⇒ F2[O2])(implicit F: Concurrent[F2]): Stream[F2, O2]
Like parEvalMap but with unbounded concurrency.
-
def
parEvalMapUnordered[F2[x] >: F[x], O2](maxConcurrent: Int)(f: (O) ⇒ F2[O2])(implicit F: Concurrent[F2]): Stream[F2, O2]
Like Stream#evalMap, but will evaluate effects in parallel, emitting the results downstream.
Like Stream#evalMap, but will evaluate effects in parallel, emitting the results downstream. The number of concurrent effects is limited by the
maxConcurrent
parameter.See Stream#parEvalMap if retaining the original order of the stream is required.
scala> import cats.effect.IO, cats.effect.unsafe.implicits.global scala> Stream(1,2,3,4).covary[IO].parEvalMapUnordered(2)(i => IO(println(i))).compile.drain.unsafeRunSync() res0: Unit = ()
Example: -
def
parEvalMapUnorderedUnbounded[F2[x] >: F[x], O2](f: (O) ⇒ F2[O2])(implicit F: Concurrent[F2]): Stream[F2, O2]
Like parEvalMapUnordered but with unbounded concurrency.
-
def
parZip[F2[x] >: F[x], O2](that: Stream[F2, O2])(implicit arg0: Concurrent[F2]): Stream[F2, (O, O2)]
Concurrent zip.
Concurrent zip.
It combines elements pairwise and in order like
zip
, but instead of pulling from the left stream and then from the right stream, it evaluates both pulls concurrently. The resulting stream terminates when either stream terminates.The concurrency is bounded following a model of successive races: both sides start evaluation of a single element concurrently, and whichever finishes first waits for the other to catch up and the resulting pair to be emitted, at which point the process repeats. This means that no branch is allowed to get ahead by more than one element.
Notes: - Effects within each stream are executed in order, they are only concurrent with respect to each other. - The output of
parZip
is guaranteed to be the same aszip
, although the order in which effects are executed differs. -
def
parZipWith[F2[x] >: F[x], O2 >: O, O3, O4](that: Stream[F2, O3])(f: (O2, O3) ⇒ O4)(implicit arg0: Concurrent[F2]): Stream[F2, O4]
Like
parZip
, but combines elements pairwise with a function instead of tupling them. -
def
pauseWhen[F2[x] >: F[x]](pauseWhenTrue: Signal[F2, Boolean])(implicit arg0: Concurrent[F2]): Stream[F2, O]
Pause this stream when
pauseWhenTrue
istrue
, resume when it'sfalse
. -
def
pauseWhen[F2[x] >: F[x]](pauseWhenTrue: Stream[F2, Boolean])(implicit arg0: Concurrent[F2]): Stream[F2, O]
Pause this stream when
pauseWhenTrue
emitstrue
, resuming whenfalse
is emitted. -
def
prefetch[F2[x] >: F[x]](implicit arg0: Concurrent[F2]): Stream[F2, O]
Alias for
prefetchN(1)
. -
def
prefetchN[F2[x] >: F[x]](n: Int)(implicit arg0: Concurrent[F2]): Stream[F2, O]
Behaves like
identity
, but starts fetches up ton
chunks in parallel with downstream consumption, enabling processing on either side of theprefetchN
to run in parallel. -
def
printlns[F2[x] >: F[x], O2 >: O](implicit F: Console[F2], showO: Show[O2] = Show.fromToString[O2]): Stream[F2, Nothing]
Prints each element of this stream to standard out, converting each element to a
String
viaShow
. -
def
rechunkRandomly[F2[x] >: F[x]](minFactor: Double = 0.1, maxFactor: Double = 2.0): Stream[F2, O]
Rechunks the stream such that output chunks are within [inputChunk.size * minFactor, inputChunk.size * maxFactor].
-
def
rechunkRandomlyWithSeed[F2[x] >: F[x]](minFactor: Double, maxFactor: Double)(seed: Long): Stream[F2, O]
Rechunks the stream such that output chunks are within
[inputChunk.size * minFactor, inputChunk.size * maxFactor]
.Rechunks the stream such that output chunks are within
[inputChunk.size * minFactor, inputChunk.size * maxFactor]
. The pseudo random generator is deterministic based on the supplied seed. -
def
reduce[O2 >: O](f: (O2, O2) ⇒ O2): Stream[F, O2]
Alias for fold1.
-
def
reduceSemigroup[O2 >: O](implicit S: Semigroup[O2]): Stream[F, O2]
Reduces this stream with the Semigroup for
O
.Reduces this stream with the Semigroup for
O
.scala> Stream("The", "quick", "brown", "fox").intersperse(" ").reduceSemigroup.toList res0: List[String] = List(The quick brown fox)
Example: -
def
repartition[O2 >: O](f: (O2) ⇒ Chunk[O2])(implicit S: Semigroup[O2]): Stream[F, O2]
Repartitions the input with the function
f
.Repartitions the input with the function
f
. On each stepf
is applied to the input and all elements but the last of the resulting sequence are emitted. The last element is then appended to the next input using the SemigroupS
.scala> Stream("Hel", "l", "o Wor", "ld").repartition(s => Chunk.array(s.split(" "))).toList res0: List[String] = List(Hello, World)
Example: -
def
repeat: Stream[F, O]
Repeat this stream an infinite number of times.
Repeat this stream an infinite number of times.
s.repeat == s ++ s ++ s ++ ...
scala> Stream(1,2,3).repeat.take(8).toList res0: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2)
Example: -
def
repeatN(n: Long): Stream[F, O]
Repeat this stream a given number of times.
Repeat this stream a given number of times.
s.repeatN(n) == s ++ s ++ s ++ ... (n times)
scala> Stream(1,2,3).repeatN(3).take(100).toList res0: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3)
Example: -
def
rethrow[F2[x] >: F[x], O2](implicit ev: <:<[O, Either[Throwable, O2]], rt: RaiseThrowable[F2]): Stream[F2, O2]
Converts a
Stream[F,Either[Throwable,O]]
to aStream[F,O]
, which emits right values and fails upon the firstLeft(t)
.Converts a
Stream[F,Either[Throwable,O]]
to aStream[F,O]
, which emits right values and fails upon the firstLeft(t)
. Preserves chunkiness.- Annotations
- @nowarn()
scala> import cats.effect.SyncIO scala> Stream(Right(1), Right(2), Left(new RuntimeException), Right(3)).rethrow[SyncIO, Int].handleErrorWith(_ => Stream(-1)).compile.toList.unsafeRunSync() res0: List[Int] = List(1, 2, -1)
Example: -
def
scan[O2](z: O2)(f: (O2, O) ⇒ O2): Stream[F, O2]
Left fold which outputs all intermediate results.
Left fold which outputs all intermediate results.
scala> Stream(1,2,3,4).scan(0)(_ + _).toList res0: List[Int] = List(0, 1, 3, 6, 10)
More generally:
Stream().scan(z)(f) == Stream(z)
Stream(x1).scan(z)(f) == Stream(z, f(z,x1))
Stream(x1,x2).scan(z)(f) == Stream(z, f(z,x1), f(f(z,x1),x2))
etc
Example: -
def
scan1[O2 >: O](f: (O2, O2) ⇒ O2): Stream[F, O2]
Like
scan
, but uses the first element of the stream as the seed.Like
scan
, but uses the first element of the stream as the seed.scala> Stream(1,2,3,4).scan1(_ + _).toList res0: List[Int] = List(1, 3, 6, 10)
Example: -
def
scanChunks[S, O2 >: O, O3](init: S)(f: (S, Chunk[O2]) ⇒ (S, Chunk[O3])): Stream[F, O3]
Like
scan
butf
is applied to each chunk of the source stream.Like
scan
butf
is applied to each chunk of the source stream. The resulting chunk is emitted while the resulting state is used in the next invocation off
.Many stateful pipes can be implemented efficiently (i.e., supporting fusion) with this method.
-
def
scanChunksOpt[S, O2 >: O, O3](init: S)(f: (S) ⇒ Option[(Chunk[O2]) ⇒ (S, Chunk[O3])]): Stream[F, O3]
More general version of
scanChunks
where the current state (i.e.,S
) can be inspected to determine if another chunk should be pulled or if the stream should terminate.More general version of
scanChunks
where the current state (i.e.,S
) can be inspected to determine if another chunk should be pulled or if the stream should terminate. Termination is signaled by returningNone
fromf
. Otherwise, a function which consumes the next chunk is returned wrapped inSome
.scala> def take[F[_],O](s: Stream[F,O], n: Int): Stream[F,O] = | s.scanChunksOpt(n) { n => if (n <= 0) None else Some((c: Chunk[O]) => if (c.size < n) (n - c.size, c) else (0, c.take(n))) } scala> take(Stream.range(0,100), 5).toList res0: List[Int] = List(0, 1, 2, 3, 4)
Example: -
def
scanMap[O2](f: (O) ⇒ O2)(implicit O2: Monoid[O2]): Stream[F, O2]
Alias for
map(f).scanMonoid
.Alias for
map(f).scanMonoid
.scala> Stream("a", "aa", "aaa", "aaaa").scanMap(_.length).toList res0: List[Int] = List(0, 1, 3, 6, 10)
Example: -
def
scanMonoid[O2 >: O](implicit O: Monoid[O2]): Stream[F, O2]
Folds this stream with the monoid for
O
while emitting all intermediate results.Folds this stream with the monoid for
O
while emitting all intermediate results.scala> Stream(1, 2, 3, 4).scanMonoid.toList res0: List[Int] = List(0, 1, 3, 6, 10)
Example: -
def
scope: Stream[F, O]
Introduces an explicit scope.
Introduces an explicit scope.
Scopes are normally introduced automatically, when using
bracket
or similar operations that acquire resources and run finalizers. Manual scope introduction is useful when using onFinalizeWeak/onFinalizeCaseWeak, where no scope is introduced. -
def
sliding(size: Int, step: Int): Stream[F, Chunk[O]]
Groups inputs in fixed size chunks by passing a "sliding window" of size with step over them.
Groups inputs in fixed size chunks by passing a "sliding window" of size with step over them. If the input contains less than or equal to
size
elements, only one chunk of this size will be emitted.scala> Stream(1, 2, 3, 4, 5).sliding(2, 3).toList res0: List[fs2.Chunk[Int]] = List(Chunk(1, 2), Chunk(4, 5)) scala> Stream(1, 2, 3, 4, 5).sliding(3, 2).toList res1: List[fs2.Chunk[Int]] = List(Chunk(1, 2, 3), Chunk(3, 4, 5))
- Exceptions thrown
scala.IllegalArgumentException
ifsize
<= 0 |step
<= 0
Example: -
def
sliding(n: Int): Stream[F, Chunk[O]]
Groups inputs in fixed size chunks by passing a "sliding window" of size
n
over them.Groups inputs in fixed size chunks by passing a "sliding window" of size
n
over them. If the input contains less than or equal ton
elements, only one chunk of this size will be emitted.scala> Stream(1, 2, 3, 4).sliding(2).toList res0: List[fs2.Chunk[Int]] = List(Chunk(1, 2), Chunk(2, 3), Chunk(3, 4))
- Exceptions thrown
scala.IllegalArgumentException
ifn
<= 0
Example: -
def
spaced[F2[x] >: F[x]](delay: FiniteDuration, startImmediately: Boolean = true)(implicit arg0: Temporal[F2]): Stream[F2, O]
Waits the specified
delay
between each event.Waits the specified
delay
between each event.The resulting stream emits the same elements from
this
stream, but split into singleton chunks. Between each chunk (element) it adds a pause of a fixeddelay
duration.This method differs in the timing of elements from metered. The metered combinator takes a "schedule" for elements to be released, and before each element introduces just the necessary delay to hit that time. To do so, it deducts from the pause any delay caused by other effects in the stream, or the pauses the stream consumer takes while pulling. This method, instead, simply introduced a fixed sleep time between elements, irrespective of other pauses in the stream or the consumer.
Starts immediately, same as meteredStartImmediately unless parameter
startImmediately
is set to false. -
def
spawn[F2[x] >: F[x]](implicit F: Concurrent[F2]): Stream[F2, Fiber[F2, Throwable, Unit]]
Starts this stream in the background and cancels it as finalization of the returned stream.
Starts this stream in the background and cancels it as finalization of the returned stream.
Any errors that occur in the background stream results in the foreground stream terminating with an error.
-
def
split(f: (O) ⇒ Boolean): Stream[F, Chunk[O]]
Breaks the input into chunks where the delimiter matches the predicate.
Breaks the input into chunks where the delimiter matches the predicate. The delimiter does not appear in the output. Two adjacent delimiters in the input result in an empty chunk in the output.
scala> Stream.range(0, 10).split(_ % 4 == 0).toList res0: List[Chunk[Int]] = List(Chunk(), Chunk(1, 2, 3), Chunk(5, 6, 7), Chunk(9))
Example: -
def
switchMap[F2[x] >: F[x], O2](f: (O) ⇒ Stream[F2, O2])(implicit F: Concurrent[F2]): Stream[F2, O2]
Like Stream.flatMap but interrupts the inner stream when new elements arrive in the outer stream.
Like Stream.flatMap but interrupts the inner stream when new elements arrive in the outer stream.
The implementation will try to preserve chunks like Stream.merge.
Finializers of each inner stream are guaranteed to run before the next inner stream starts.
When the outer stream stops gracefully, the currently running inner stream will continue to run.
When an inner stream terminates/interrupts, nothing happens until the next element arrives in the outer stream(i.e the outer stream holds the stream open during this time or else the stream terminates)
When either the inner or outer stream fails, the entire stream fails and the finalizer of the inner stream runs before the outer one.
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
tail: Stream[F, O]
Emits all elements of the input except the first one.
Emits all elements of the input except the first one.
scala> Stream(1,2,3).tail.toList res0: List[Int] = List(2, 3)
Example: -
def
take(n: Long): Stream[F, O]
Emits the first
n
elements of this stream.Emits the first
n
elements of this stream.scala> Stream.range(0,1000).take(5).toList res0: List[Int] = List(0, 1, 2, 3, 4)
Example: -
def
takeRight(n: Int): Stream[F, O]
Emits the last
n
elements of the input.Emits the last
n
elements of the input.scala> Stream.range(0,1000).takeRight(5).toList res0: List[Int] = List(995, 996, 997, 998, 999)
Example: -
def
takeThrough(p: (O) ⇒ Boolean): Stream[F, O]
Like takeWhile, but emits the first value which tests false.
Like takeWhile, but emits the first value which tests false.
scala> Stream.range(0,1000).takeThrough(_ != 5).toList res0: List[Int] = List(0, 1, 2, 3, 4, 5)
Example: -
def
takeWhile(p: (O) ⇒ Boolean, takeFailure: Boolean = false): Stream[F, O]
Emits the longest prefix of the input for which all elements test true according to
f
.Emits the longest prefix of the input for which all elements test true according to
f
.scala> Stream.range(0,1000).takeWhile(_ != 5).toList res0: List[Int] = List(0, 1, 2, 3, 4)
Example: -
def
through[F2[x] >: F[x], O2](f: (Stream[F, O]) ⇒ Stream[F2, O2]): Stream[F2, O2]
Transforms this stream using the given
Pipe
.Transforms this stream using the given
Pipe
.scala> Stream("Hello", "world").through(text.utf8.encode).toVector.toArray res0: Array[Byte] = Array(72, 101, 108, 108, 111, 119, 111, 114, 108, 100)
Example: -
def
through2[F2[x] >: F[x], O2, O3](s2: Stream[F2, O2])(f: (Stream[F, O], Stream[F2, O2]) ⇒ Stream[F2, O3]): Stream[F2, O3]
Transforms this stream and
s2
using the givenPipe2
. -
def
timeout[F2[x] >: F[x]](timeout: FiniteDuration)(implicit arg0: Temporal[F2]): Stream[F2, O]
Fails this stream with a
TimeoutException
if it does not complete within giventimeout
. -
def
toString(): String
- Definition Classes
- Stream → AnyRef → Any
-
def
translate[F2[x] >: F[x], G[_]](u: ~>[F2, G]): Stream[G, O]
Translates effect type from
F
toG
using the suppliedFunctionK
. -
def
unchunks[O2](implicit ev: <:<[O, Chunk[O2]]): Stream[F, O2]
Flattens a stream of chunks.
Flattens a stream of chunks. Inverse of chunks.
-
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( ... )
-
def
withFilter(f: (O) ⇒ Boolean): Stream[F, O]
Alias for filter Implemented to enable filtering in for comprehensions
-
def
zip[F2[x] >: F[x], O2](that: Stream[F2, O2]): Stream[F2, (O, O2)]
Deterministically zips elements, terminating when the end of either branch is reached naturally.
Deterministically zips elements, terminating when the end of either branch is reached naturally.
scala> Stream(1, 2, 3).zip(Stream(4, 5, 6, 7)).toList res0: List[(Int,Int)] = List((1,4), (2,5), (3,6))
Example: -
def
zipAll[F2[x] >: F[x], O2 >: O, O3](that: Stream[F2, O3])(pad1: O2, pad2: O3): Stream[F2, (O2, O3)]
Determinsitically zips elements, terminating when the ends of both branches are reached naturally, padding the left branch with
pad1
and padding the right branch withpad2
as necessary.Determinsitically zips elements, terminating when the ends of both branches are reached naturally, padding the left branch with
pad1
and padding the right branch withpad2
as necessary.scala> Stream(1,2,3).zipAll(Stream(4,5,6,7))(0,0).toList res0: List[(Int,Int)] = List((1,4), (2,5), (3,6), (0,7))
Example: -
def
zipAllWith[F2[x] >: F[x], O2 >: O, O3, O4](that: Stream[F2, O3])(pad1: O2, pad2: O3)(f: (O2, O3) ⇒ O4): Stream[F2, O4]
Determinsitically zips elements with the specified function, terminating when the ends of both branches are reached naturally, padding the left branch with
pad1
and padding the right branch withpad2
as necessary.Determinsitically zips elements with the specified function, terminating when the ends of both branches are reached naturally, padding the left branch with
pad1
and padding the right branch withpad2
as necessary.scala> Stream(1,2,3).zipAllWith(Stream(4,5,6,7))(0, 0)(_ + _).toList res0: List[Int] = List(5, 7, 9, 7)
Example: -
def
zipLeft[F2[x] >: F[x], O2](that: Stream[F2, O2]): Stream[F2, O]
Like
zip
, but selects the left values only.Like
zip
, but selects the left values only. Useful with timed streams, the example below will emit a number every 100 milliseconds.scala> import scala.concurrent.duration._, cats.effect.IO, cats.effect.unsafe.implicits.global scala> val s = Stream.range(0, 5) zipLeft Stream.fixedDelay[IO](100.millis) scala> s.compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 1, 2, 3, 4)
Example: -
def
zipRight[F2[x] >: F[x], O2](that: Stream[F2, O2]): Stream[F2, O2]
Like
zip
, but selects the right values only.Like
zip
, but selects the right values only. Useful with timed streams, the example below will emit a number every 100 milliseconds.scala> import scala.concurrent.duration._, cats.effect.IO, cats.effect.unsafe.implicits.global scala> val s = Stream.fixedDelay[IO](100.millis) zipRight Stream.range(0, 5) scala> s.compile.toVector.unsafeRunSync() res0: Vector[Int] = Vector(0, 1, 2, 3, 4)
Example: -
def
zipWith[F2[x] >: F[x], O2 >: O, O3, O4](that: Stream[F2, O3])(f: (O2, O3) ⇒ O4): Stream[F2, O4]
Deterministically zips elements using the specified function, terminating when the end of either branch is reached naturally.
Deterministically zips elements using the specified function, terminating when the end of either branch is reached naturally.
scala> Stream(1, 2, 3).zipWith(Stream(4, 5, 6, 7))(_ + _).toList res0: List[Int] = List(5, 7, 9)
Example: -
def
zipWithIndex: Stream[F, (O, Long)]
Zips the elements of the input stream with its indices, and returns the new stream.
Zips the elements of the input stream with its indices, and returns the new stream.
scala> Stream("The", "quick", "brown", "fox").zipWithIndex.toList res0: List[(String,Long)] = List((The,0), (quick,1), (brown,2), (fox,3))
Example: -
def
zipWithNext: Stream[F, (O, Option[O])]
Zips each element of this stream with the next element wrapped into
Some
.Zips each element of this stream with the next element wrapped into
Some
. The last element is zipped withNone
.scala> Stream("The", "quick", "brown", "fox").zipWithNext.toList res0: List[(String,Option[String])] = List((The,Some(quick)), (quick,Some(brown)), (brown,Some(fox)), (fox,None))
Example: -
def
zipWithPrevious: Stream[F, (Option[O], O)]
Zips each element of this stream with the previous element wrapped into
Some
.Zips each element of this stream with the previous element wrapped into
Some
. The first element is zipped withNone
.scala> Stream("The", "quick", "brown", "fox").zipWithPrevious.toList res0: List[(Option[String],String)] = List((None,The), (Some(The),quick), (Some(quick),brown), (Some(brown),fox))
Example: -
def
zipWithPreviousAndNext: Stream[F, (Option[O], O, Option[O])]
Zips each element of this stream with its previous and next element wrapped into
Some
.Zips each element of this stream with its previous and next element wrapped into
Some
. The first element is zipped withNone
as the previous element, the last element is zipped withNone
as the next element.scala> Stream("The", "quick", "brown", "fox").zipWithPreviousAndNext.toList res0: List[(Option[String],String,Option[String])] = List((None,The,Some(quick)), (Some(The),quick,Some(brown)), (Some(quick),brown,Some(fox)), (Some(brown),fox,None))
Example: -
def
zipWithScan[O2](z: O2)(f: (O2, O) ⇒ O2): Stream[F, (O, O2)]
Zips the input with a running total according to
S
, up to but not including the current element.Zips the input with a running total according to
S
, up to but not including the current element. Thus the initialz
value is the first emitted to the output:scala> Stream("uno", "dos", "tres", "cuatro").zipWithScan(0)(_ + _.length).toList res0: List[(String,Int)] = List((uno,0), (dos,3), (tres,6), (cuatro,10))
- See also
Example: -
def
zipWithScan1[O2](z: O2)(f: (O2, O) ⇒ O2): Stream[F, (O, O2)]
Zips the input with a running total according to
S
, including the current element.Zips the input with a running total according to
S
, including the current element. Thus the initialz
value is the first emitted to the output:scala> Stream("uno", "dos", "tres", "cuatro").zipWithScan1(0)(_ + _.length).toList res0: List[(String, Int)] = List((uno,3), (dos,6), (tres,10), (cuatro,16))
- See also
Example:
Deprecated Value Members
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] ) @Deprecated
- Deprecated
-
def
translateInterruptible[F2[x] >: F[x], G[_]](u: ~>[F2, G]): Stream[G, O]
Translates effect type from
F
toG
using the suppliedFunctionK
.Translates effect type from
F
toG
using the suppliedFunctionK
.- Annotations
- @deprecated
- Deprecated
(Since version 3.0) Use translate instead
-
def
unchunk: Stream[F, O]
Converts the input to a stream of 1-element chunks.
Converts the input to a stream of 1-element chunks.
- Annotations
- @deprecated
- Deprecated
(Since version 3.1.0) Use .chunkLimit(1).unchunks instead.