Concatenates this segment with s2
.
Concatenates this segment with s2
.
scala> (Segment(1,2,3) ++ Segment(4,5,6)).toVector res0: Vector[Int] = Vector(1, 2, 3, 4, 5, 6)
Like ++
but allows the result type of s2
to differ from R
.
Like ++
but allows the result type of s2
to differ from R
.
Returns the element at the specified index.
Alias for mapResult( => r2)
.
Alias for mapResult( => r2)
.
Filters and maps simultaneously.
Filters and maps simultaneously.
scala> Segment(Some(1), None, Some(2)).collect { case Some(i) => i }.toVector res0: Vector[Int] = Vector(1, 2)
Equivalent to Segment.singleton(o2) ++ this
.
Equivalent to Segment.singleton(o2) ++ this
.
scala> Segment(1, 2, 3).cons(0).toVector res0: Vector[Int] = Vector(0, 1, 2, 3)
Returns a segment that suppresses all output and returns the result of this segment when run.
Returns a segment that suppresses all output and returns the result of this segment when run.
scala> Segment.from(0).take(3).drain.run.toOption.get.take(5).toVector res0: Vector[Long] = Vector(3, 4, 5, 6, 7)
Eagerly drops n
elements from the head of this segment, returning either the result and the
number of elements remaining to drop, if the end of the segment was reached, or a new segment,
if the end of the segment was not reached.
Eagerly drops n
elements from the head of this segment, returning either the result and the
number of elements remaining to drop, if the end of the segment was reached, or a new segment,
if the end of the segment was not reached.
scala> Segment(1,2,3,4,5).drop(3).toOption.get.toVector res0: Vector[Int] = Vector(4, 5) scala> Segment(1,2,3,4,5).drop(7) res1: Either[(Unit, Long),Segment[Int,Unit]] = Left(((),2))
Eagerly drops elements from the head of this segment until the supplied predicate returns false, returning either the result, if the end of the segment was reached without the predicate failing, or the remaining segment.
Eagerly drops elements from the head of this segment until the supplied predicate returns false, returning either the result, if the end of the segment was reached without the predicate failing, or the remaining segment.
If dropFailure
is true, the first element that failed the predicate will be dropped. If false,
the first element that failed the predicate will be the first element of the remainder.
scala> Segment(1,2,3,4,5).dropWhile(_ < 3).map(_.toVector) res0: Either[Unit,Vector[Int]] = Right(Vector(3, 4, 5)) scala> Segment(1,2,3,4,5).dropWhile(_ < 10) res1: Either[Unit,Segment[Int,Unit]] = Left(())
Filters output elements of this segment with the supplied predicate.
Filters output elements of this segment with the supplied predicate.
scala> Segment(1,2,3,4,5).filter(_ % 2 == 0).toVector res0: Vector[Int] = Vector(2, 4)
List-like flatMap
, which applies f
to each element of the segment and concatenates
the results.
List-like flatMap
, which applies f
to each element of the segment and concatenates
the results.
scala> Segment(1, 2, 3).flatMap(i => Segment.seq(List.fill(i)(i))).toVector res0: Vector[Int] = Vector(1, 2, 2, 3, 3, 3)
Stateful version of flatMap
, where the function depends on a state value initialized to
init
and updated upon each output.
Stateful version of flatMap
, where the function depends on a state value initialized to
init
and updated upon each output.
The final state is returned in the result, paired with the result of the source stream.
scala> val src = Segment("Hello", "World", "\n", "From", "Mars").flatMapAccumulate(0)((l,s) => | if (s == "\n") Segment.empty.asResult(0) else Segment((l,s)).asResult(l + s.length)) scala> src.toVector res0: Vector[(Int,String)] = Vector((0,Hello), (5,World), (0,From), (4,Mars)) scala> src.void.run res1: (Unit,Int) = ((),8)
Like append
but allows to use result to continue the segment.
Like append
but allows to use result to continue the segment.
Flattens a Segment[Segment[O2,R],R]
in to a Segment[O2,R]
.
Flattens a Segment[Segment[O2,R],R]
in to a Segment[O2,R]
.
scala> Segment(Segment(1, 2), Segment(3, 4, 5)).flatten.toVector res0: Vector[Int] = Vector(1, 2, 3, 4, 5)
Flattens a Segment[Chunk[O2],R]
in to a Segment[O2,R]
.
Flattens a Segment[Chunk[O2],R]
in to a Segment[O2,R]
.
scala> Segment(Chunk(1, 2), Chunk(3, 4, 5)).flattenChunks.toVector res0: Vector[Int] = Vector(1, 2, 3, 4, 5)
Folds the output elements of this segment and returns the result as the result of the returned segment.
Folds the output elements of this segment and returns the result as the result of the returned segment.
scala> Segment(1,2,3,4,5).fold(0)(_ + _).run res0: Int = 15
Invokes f
on each output of this segment.
Invokes f
on each output of this segment.
scala> val buf = collection.mutable.ListBuffer[Int]() scala> Segment(1,2,3).cons(0).foreach(i => buf += i) res0: Unit = () scala> buf.toList res1: List[Int] = List(0, 1, 2, 3)
Invokes f
on each chunk of this segment.
Returns the index of the first element which passes the specified predicate (i.e., p(i) == true
)
or None
if no elements pass the predicate.
Returns the index of the first element which passes the specified predicate (i.e., p(i) == true
)
or None
if no elements pass the predicate.
True if size is zero, false otherwise.
True if size is zero, false otherwise.
Returns a segment that suppresses all output and returns the last element output by source segment paired with the source segment result.
Returns a segment that suppresses all output and returns the last element output by source segment paired with the source segment result.
scala> Segment(1,2,3).last.run res0: (Unit, Option[Int]) = ((),Some(3))
Returns a segment that maps each output using the supplied function.
Returns a segment that maps each output using the supplied function.
scala> Segment(1,2,3).map(_ + 1).toVector res0: Vector[Int] = Vector(2, 3, 4)
Stateful version of map, where the map function depends on a state value initialized to
init
and updated upon each output value.
Stateful version of map, where the map function depends on a state value initialized to
init
and updated upon each output value.
The final state is returned in the result, paired with the result of the source stream.
scala> val src = Segment("Hello", "World").mapAccumulate(0)((l,s) => (l + s.length, (l, s))) scala> src.toVector res0: Vector[(Int,String)] = Vector((0,Hello), (5,World)) scala> src.void.run res1: (Unit,Int) = ((),10)
Returns a segment that maps each output using the supplied function and concatenates all the results.
Returns a segment that maps each output using the supplied function and concatenates all the results.
scala> Segment(1,2,3).mapConcat(o => Chunk.seq(List.range(0, o))).toVector res0: Vector[Int] = Vector(0, 0, 1, 0, 1, 2)
Maps the supplied function over the result of this segment.
Maps the supplied function over the result of this segment.
scala> Segment('a', 'b', 'c').withSize.mapResult { case (_, size) => size }.void.run res0: Long = 3
Strict version of map
.
False if size is zero, true otherwise.
False if size is zero, true otherwise.
Equivalent to s2 ++ this
.
Equivalent to s2 ++ this
.
scala> Segment(1, 2, 3).prepend(Segment(-1, 0)).toVector res0: Vector[Int] = Vector(-1, 0, 1, 2, 3)
Computes the result of this segment.
Computes the result of this segment. May only be called when O
is Unit
, to prevent accidentally ignoring
output values. To intentionally ignore outputs, call s.void.run
.
scala> Segment(1, 2, 3).withSize.void.run res0: (Unit,Long) = ((),3)
Like fold but outputs intermediate results.
Like fold but outputs intermediate results. If emitFinal
is true, upon reaching the end of the stream, the accumulated
value is output. If emitFinal
is false, the accumulated output is not output. Regardless, the accumulated value is
returned as the result of the segment.
scala> Segment(1, 2, 3, 4, 5).scan(0)(_+_).toVector res0: Vector[Int] = Vector(0, 1, 3, 6, 10, 15)
Returns the number of elements in this chunk.
Splits this segment at the specified index by simultaneously taking and dropping.
Splits this segment at the specified index by simultaneously taking and dropping.
If the segment has less than n
elements, a left is returned, providing the result of the segment,
all sub-segments taken, and the remaining number of elements (i.e., size - n).
If the segment has more than n
elements, a right is returned, providing the sub-segments up to
the n
-th element and a remainder segment.
The prefix is computed eagerly while the suffix is computed lazily.
scala> Segment(1, 2, 3, 4, 5).splitAt(2) res0: Either[(Unit,Catenable[Segment[Int,Unit]],Long),(Catenable[Segment[Int,Unit]],Segment[Int,Unit])] = Right((Catenable(Chunk(1, 2)),Chunk(3, 4, 5))) scala> Segment(1, 2, 3, 4, 5).splitAt(7) res0: Either[(Unit,Catenable[Segment[Int,Unit]],Long),(Catenable[Segment[Int,Unit]],Segment[Int,Unit])] = Left(((),Catenable(Chunk(1, 2, 3, 4, 5)),2))
Strict version of splitAt
- n
is guaranteed to be within bounds so implementations do not need to do bounds checking.
Splits this segment at the first element where the supplied predicate returns false.
Splits this segment at the first element where the supplied predicate returns false.
Analagous to siumultaneously running takeWhile
and dropWhile
.
If emitFailure
is false, the first element which fails the predicate is returned in the suffix segment. If true,
it is returned as the last element in the prefix segment.
If the end of the segment is reached and the predicate has not failed, a left is returned, providing the segment result and the catenated sub-segments. Otherwise, a right is returned, providing the prefix sub-segments and the suffix remainder.
scala> Segment(1, 2, 3, 4, 5).splitWhile(_ != 3) res0: Either[(Unit,Catenable[Segment[Int,Unit]]),(Catenable[Segment[Int,Unit]],Segment[Int,Unit])] = Right((Catenable(Chunk(1, 2)),Chunk(3, 4, 5))) scala> Segment(1, 2, 3, 4, 5).splitWhile(_ != 7) res0: Either[(Unit,Catenable[Segment[Int,Unit]]),(Catenable[Segment[Int,Unit]],Segment[Int,Unit])] = Left(((),Catenable(Chunk(1, 2, 3, 4, 5))))
Provides access to strict equivalent methods defined lazily on Segment
.
Provides access to strict equivalent methods defined lazily on Segment
.
Sums the elements of this segment and returns the sum as the segment result.
Sums the elements of this segment and returns the sum as the segment result.
scala> Segment(1, 2, 3, 4, 5).sum.run res0: Int = 15
Lazily takes n
elements from this segment.
Lazily takes n
elements from this segment. The result of the returned segment is either a left
containing the result of the original segment and the number of elements remaining to take when
the end of the source segment was reached, or a right containing the remainder of the source
segment after n
elements are taken.
scala> Segment.from(0).take(3).toVector res0: Vector[Long] = Vector(0, 1, 2) scala> Segment.from(0).take(3).void.run.toOption.get.take(5).toVector res1: Vector[Long] = Vector(3, 4, 5, 6, 7) scala> Segment(1, 2, 3).take(5).void.run res2: Either[(Unit, Long),Segment[Int,Unit]] = Left(((),2))
Returns a segment that outputs elements while p
is true.
Returns a segment that outputs elements while p
is true.
The result of the returned segment is either the result of the original stream, if the end
was reached and the predicate was still passing, or the remaining stream, if the predicate failed.
If takeFailure
is true, the last element output is the first element which failed the predicate.
If takeFailure
is false, the first element of the remainder is the first element which failed
the predicate.
scala> Segment.from(0).takeWhile(_ < 3).toVector res0: Vector[Long] = Vector(0, 1, 2) scala> Segment.from(0).takeWhile(_ < 3, takeFailure = true).toVector res1: Vector[Long] = Vector(0, 1, 2, 3) scala> Segment.from(0).takeWhile(_ < 3).void.run.toOption.get.take(5).toVector res2: Vector[Long] = Vector(3, 4, 5, 6, 7)
Copies the elements of this chunk to an array.
Converts this chunk to a Chunk.Booleans
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Booleans
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of booleans, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this chunk to a Chunk.Bytes
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Bytes
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of bytes, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this segment to a catenable of output values, discarding the result.
Converts this segment to a catenable of output values, discarding the result.
Caution: calling toCatenable
on an infinite sequence will not terminate.
scala> Segment(1, 2, 3).cons(0).cons(-1).toCatenable.toList res0: List[Int] = List(-1, 0, 1, 2, 3)
Converts this segment to a single chunk, discarding the result.
Converts this segment to a sequence of chunks, discarding the result.
Converts this segment to a sequence of chunks, discarding the result.
Caution: calling toChunks
on an infinite sequence will not terminate.
Converts this chunk to a Chunk.Doubles
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Doubles
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of doubles, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this chunk to a Chunk.Floats
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Floats
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of doubles, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this chunk to a Chunk.Ints
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Ints
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of bytes, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this segment to a list, discarding the result.
Converts this segment to a list, discarding the result.
Caution: calling toList
on an infinite sequence will not terminate.
scala> Segment(1, 2, 3).cons(0).cons(-1).toList res0: List[Int] = List(-1, 0, 1, 2, 3)
Converts this chunk to a Chunk.Longs
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Longs
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of longs, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this chunk to a Chunk.Shorts
, allowing access to the underlying array of elements.
Converts this chunk to a Chunk.Shorts
, allowing access to the underlying array of elements.
If this chunk is already backed by an unboxed array of bytes, this method runs in constant time.
Otherwise, this method will copy of the elements of this chunk in to a single array.
Converts this segment to a list, discarding the result.
Returns the first output sub-segment of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
Returns the first output sub-segment of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
scala> Segment(1, 2, 3).cons(0).uncons res0: Either[Unit,(Segment[Int,Unit], Segment[Int,Unit])] = Right((Chunk(0),Chunk(1, 2, 3))) scala> Segment.empty[Int].uncons res1: Either[Unit,(Segment[Int,Unit], Segment[Int,Unit])] = Left(())
Returns the first output of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
Returns the first output of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
scala> Segment(1, 2, 3).cons(0).uncons1 res0: Either[Unit,(Int, Segment[Int,Unit])] = Right((0,Chunk(1, 2, 3))) scala> Segment.empty[Int].uncons1 res1: Either[Unit,(Int, Segment[Int,Unit])] = Left(())
Returns the first output chunk of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
Returns the first output chunk of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
Returns the first output chunks of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
Returns the first output chunks of this segment along with the remainder, wrapped in Right
, or
if this segment is empty, returns the result wrapped in Left
.
Differs from unconsChunk
when a single step results in multiple outputs.
scala> Segment(1, 2, 3).prepend(Chunk(-1, 0)).unconsChunks res0: Either[Unit,(Catenable[Chunk[Int]], Segment[Int,Unit])] = Right((Catenable(Chunk(-1, 0)),Chunk(1, 2, 3))) scala> Segment.empty[Int].unconsChunks res1: Either[Unit,(Catenable[Chunk[Int]], Segment[Int,Unit])] = Left(())
Alias for map(_ => ())
.
Alias for map(_ => ())
.
scala> Segment(1, 2, 3).void.toList res0: List[Unit] = List((), (), ())
Returns a new segment which discards the result and replaces it with unit.
Returns a new segment which discards the result and replaces it with unit.
scala> Segment(1, 2, 3).take(2).voidResult res0: Segment[Int,Unit] = ((Chunk(1, 2, 3)).take(2)).mapResult(<f1>)
Returns a new segment which includes the number of elements output in the result.
Returns a new segment which includes the number of elements output in the result.
scala> Segment(1, 2, 3).withSize.void.run res0: (Unit,Long) = ((),3)
Zips this segment with another segment using the supplied function to combine elements from this and that.
Zips this segment with another segment using the supplied function to combine elements from this and that. Terminates when either segment terminates.
scala> Segment(1,2,3).zipWith(Segment(4,5,6,7))(_+_).toList res0: List[Int] = List(5, 7, 9)