~

object Stream extends _default with _build with _info with _use
Companion
class
Source
__.scala
trait _use
trait _read
trait _process
trait _print
trait _evaluate
trait _info
trait _build
trait _zip
trait _peek
trait _parallel
trait _order
trait _mutate
trait _map
trait _group
trait _filter
trait _drop
trait _take
trait _extend
class _default
class Object
trait Matchable
class Any

Member

trait _build extends _extend with _filter with _group with _map with _mutate with _order with _parallel with _peek with _zip

Build Interface

Build methods extend stream pipeline creating functionality which will add, remove or modify stream elements, when they finally start moving throught the pipeline

Companion
object
Source
__.scala
trait _build extends _extend with _filter with _group with _map with _mutate with _order with _parallel with _peek with _zip

Build Interface

Build methods extend stream pipeline creating functionality which will add, remove or modify stream elements, when they finally start moving throught the pipeline

Companion
object
Source
__.scala
trait _info

Metadata Interface

Metadata is a static knowledge about stream elements to be delivered

Metadata methods can be called many times, they do not trigger any data movements

Source
_info.scala
trait _use extends _aggregate with _calculate with _evaluate with _print with _process with _read with _transformTo
trait _use extends _aggregate with _calculate with _evaluate with _print with _process with _read with _transformTo
object Custom

Advanced Functionality

Object Custom holds advanced stream features

Source
__.scala
abstract class Flow[A] extends _build[A] with _use[A] with _info[A]

Stream.Flow is similar to Stream, but without sequence specific methods.

Elements of Stream.Flow can be processed either in parallel or sequentially

Companion
object
Source
__.scala
abstract class Flow[A] extends _build[A] with _use[A] with _info[A]

Stream.Flow is similar to Stream, but without sequence specific methods.

Elements of Stream.Flow can be processed either in parallel or sequentially

Companion
object
Source
__.scala
trait Preview[A] extends ~[A]

Preview is an extension of Stream with preview capabilities

It allows to pre-load and inspect elements before they are read from stream

val s  : ~[Int]              =  1 <> 10
val ps : Stream.Preview[Int] = s.enablePreview

ps.preview.tp            // Prints  1

ps.preview_~(5).tp       // Prints  ~(1, 2, 3, 4, 5)

ps.preview_~(3).tp       // Prints  ~(1, 2, 3)

(ps.previewSize > 12).tp // Prints false

ps.tp                    // Prints ~(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
ps.tp                    // Prints ~()
Companion
object
Source
__.scala
trait Preview[A] extends ~[A]

Preview is an extension of Stream with preview capabilities

It allows to pre-load and inspect elements before they are read from stream

val s  : ~[Int]              =  1 <> 10
val ps : Stream.Preview[Int] = s.enablePreview

ps.preview.tp            // Prints  1

ps.preview_~(5).tp       // Prints  ~(1, 2, 3, 4, 5)

ps.preview_~(3).tp       // Prints  ~(1, 2, 3)

(ps.previewSize > 12).tp // Prints false

ps.tp                    // Prints ~(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
ps.tp                    // Prints ~()
Companion
object
Source
__.scala

Def

Local

inline def apply[A](inline v: A): ~[A]

Single element consructor

Single element consructor

Source
__.scala
inline def apply[A](inline v1: A, inline v2: A): ~[A]

Double element consructor

Double element consructor

Source
__.scala
def apply[A](v1: A, v2: A, v3: A, vs: A*): ~[A]

Multi element consructor

Multi element consructor

Source
__.scala
def unapplySeq[A](v: ~[A]): Option[Seq[A]]
Source
__.scala
@targetName("getVoid")
inline def void[A]: ~[A]

Get void instance

Get void instance

Source
__.scala

Inherited inherited

@targetName("join")
inline def +[A](inline v: A): ~[A]

Alias for join

Alias for join

Creates a new Stream with given element appended to current Stream

  ((1 <> 5).~ + 99 + 100).tp

  // Output
  ~(1, 2, 3, 4, 5, 99, 100)
Inherited from
_extend
Source
_extend.scala
@targetName("joinAll")
inline def ++[A](inline v: ~[A]): ~[A]

Alias for joinAll

Alias for joinAll

Creates a new Stream with given elements appended to current Stream

  (('1' <> '9').~ ++ ('a' <> 'd') ++ ('A' <> 'D')).tp

  // Output
  ~(1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, A, B, C, D)
Inherited from
_extend
Source
_extend.scala
@targetName("joinAllAt")
inline def ++@[A](inline index: Int, inline v: ~[A]): ~[A]

Alias for joinAllAt

Alias for joinAllAt

Creates a new Stream with given elements inserted into current Stream at given index

If index is out of range, the elements are prepended or appended

   (('a' <> 'f').~ ++@ (3, 'X' <> 'Z')).tp

   // Output
   ~(a, b, c, X, Y, Z, d, e, f)
Inherited from
_extend
Source
_extend.scala
@targetName("joinAt")
inline def +@[A](inline index: Int, inline v: A): ~[A]

Alias for joinAt

Alias for joinAt

Creates a new Stream with given element inserted into current Stream at given index

If index is out of range, the element is prepended or appended

 (('a' <> 'd').~ +@ (2, 'X')).tp

  // Output
  ~(a, b, X, c, d)
Inherited from
_extend
Source
_extend.scala
@targetName("pack")
def ><[A]: ><[A]

Pack

Pack

Returns stream elements as Pack

Inherited from
_transformTo
Source
_transformTo.scala
@targetName("average")
def average[A](using v: ~.Custom.Math.Average[A]): A

Average

Average

Computes average

For empty Stream returns zero value

   (10 <> 15).~.map(_.Float).average  // Returns 12.5

Note: average is available for types providing given ~~.Custom.Math.Average implementations, which are by default Double, Float and opaque numerics based on Double and Float

Inherited from
_calculate
Source
_calculate.scala
@targetName("average_Opt")
def average_?[A](using v: ~.Custom.Math.Average[A]): Opt[A]

Average option

Average option

Computes average or returns void option for empty stream

   (10 <> 15).~.map(_.Float).average_?  // Returns Opt(12.5)

Note: average_? is available for types providing given ~~.Custom.Math.Average implementations, which are by default Double, Float and opaque numerics based on Double and Float

Inherited from
_calculate
Source
_calculate.scala
def averageFew[A](fb: A => Opt[B], fc: A => Opt[C], fd: A => Opt[D], fe: A => Opt[E], ff: A => Opt[F])(using nb: ~.Custom.Math.Average[B], nc: ~.Custom.Math.Average[C], nd: ~.Custom.Math.Average[D], ne: ~.Custom.Math.Average[E], nf: ~.Custom.Math.Average[F]): (B, C) | (B, C, D) | (B, C, D, E) | (B, C, D, E, F)

Multi average

Multi average

Simultaneously computes up to 5 average values for properties specified by functions

Returns tuple of appropriate size with values corresponding to the given mappings

For empty Stream returned tuple will hold zeros

   (1 <> 1000).~.averageFew(_ * 10F, _ * 100F).tp  // Prints (5005, 50050)

    val (first, second, third) = (1 <> 1000).~.averageFew(v => v.Double, _ * 10.0, _ * 100.0)

    first.tp     // Prints 5005
    second.tp    // Prints 5005
    third.tp     // Prints 5005

Note: Averages areavailable for types providing given Stream.Custom.Average implementations, which are by default Double, Float and opaque numerics based on Double and Float

Inherited from
_calculate
Source
_calculate.scala
inline def collect[A](inline f: PartialFunction[A, B]): ~[B]

Partial map

Partial map

Creates a new Stream by applying a partial function to all elements of current Stream on which the function is defined.

(0 <>> 26).~.collect{
 case i if(i%2==0) => ('a' + i).Char
}.tp

// Output
~(a, c, e, g, i, k, m, o, q, s, u, w, y)

Note:

  • collect is functionally similar to map_?, which is prefferable in most cases.
  • 'partialMap' would be a better name for this operation, but 'collect' is an established Scala convention.
Inherited from
_map
Source
_map.scala
def contains[A](value: A): Boolean

Value check

Value check

Returns true if stream contains given value.

Inherited from
_evaluate
Source
_evaluate.scala
def count[A](f: A => Boolean): Int

Conditional count

Conditional count

Counts all stream elements, which satisfy given predicate

Inherited from
_evaluate
Source
_evaluate.scala
def count[A]: Int

All count

All count

Counts all stream elements

Inherited from
_evaluate
Source
_evaluate.scala
def countAndTime[A]: (Int, Length)

Count and time

Count and time

Returns all elements count and Time.Length it took to pump the stream

  val (cnt,time) = (1 <> 1000).~.peek(_ => J.sleep(1.Millis)).countAndTime

  ("" + cnt + " elements processed in " + time.tag).tp

  // Output
  1000 elements processed in 1.488880500 sec
Inherited from
_evaluate
Source
_evaluate.scala
def countFew[A](f1: A => Boolean, f2: A => Boolean, f3: A => Boolean, f4: A => Boolean, f5: A => Boolean): (Int, Int) | (Int, Int, Int) | (Int, Int, Int, Int) | (Int, Int, Int, Int, Int)

Multi count

Multi count

Simultaneously counts values for up to 5 different predicates

Returns tuple of appropriate size with values corresponding to the given mappings

For empty Stream returned tuple will hold zeros

val (large, odd, even) = (1 <>> 1000).~.countFew(_ > 100, _ % 2 == 0, _ % 2 == 1)

large.tp    // Prints 899
odd.tp      // Prints 499
even.tp     // Prints 500
Inherited from
_evaluate
Source
_evaluate.scala
inline def default[A](inline v: => A): ~[A]

Default element

Default element

If current Stream is empty, the given element will be appended

Otherwise current Stream will not change

 (1 <>> 1).~.default(99).tp // Prints ~(99)

 (1 <>> 5).~.default(99).tp // Prints ~(1, 2, 3, 4)
Inherited from
_extend
Source
_extend.scala
inline def defaultDoc[A]: Info

Default info

Default info

Creates default Info object describing current stream

 ('a' <> 'z').~.defaultDoc.tp

 // Output
scalqa.def.char.g.stream.Z$Stream_fromRange@8bm3{raw=Char,size=26}

Note. Streams may provide custom Able.Info implementations, extending defaultDoc

Inherited from
_info
Source
_info.scala
inline def describe[A]: String

Text description

Text description

Returns a tree formatted text describing all stream trasformations

('a' <> 'z').~
 .map(_.Int)
 .take(_ % 2 == 0)
 .describe.tp

// Output
scalqa.def.int.g.Stream$TakeStream$2@4ds1{raw=Int}
 scalqa.def.char.z.stream.map$Ints@j38c{raw=Int,fromRaw=Char,size=26}
   scalqa.def.char.Z$Stream_fromRange@gw1k{raw=Char,size=26,from=a,step=1}
Inherited from
_info
Source
_info.scala
def drain[A]: Unit

Pump stream out

Pump stream out

Fetches and discards all stream elements

This operation can be usefull for side effects built into streaming pipeline

 ('A' <> 'C').~.peek(_.tp).drain

 // Output
 A
 B
 C
Inherited from
_process
Source
_process.scala
inline def DROP[A](inline f: A => Boolean): ~[A]

Heavy reversed filter

Heavy reversed filter

Disallows Stream elements satisfying the given function

DROP is functionally equivalent to drop, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_drop
Source
_drop.scala
inline def drop[A](inline f: A => Boolean): ~[A]

Reverse filter

Reverse filter

Disallows Stream elements satisfying the given function

  (0 <>> 10).~.drop(_ > 5).tp

  // Output
  ~(0, 1, 2, 3, 4, 5)

Note: Scala equivalent is called "filterNot"

Inherited from
_drop
Source
_drop.scala
@targetName("drop_Range")
inline def drop_<>[A](inline i: <>): ~[A]

Range reversed filter

Range reversed filter

Only allows elements outside specified sequencial range

  ('a' <> 'f').~.drop_<>(2 <> 3).tp

  // Output
  ~(a, b, e, f)

Note: Sequence indexing starts from 0

Inherited from
_drop
Source
_drop.scala
def dropAll[A](v: ~[A]): ~[A]

Multi element reversed filter

Multi element reversed filter

Only lets elements not found in given stream

  ('a' <> 'z').~.dropAll('c' <> 'x') .tp       // Prints ~(a, b, y, z)
Inherited from
_drop
Source
_drop.scala
def dropAllBy[A](f: A => B, v: ~[B]): ~[A]

Multi element mapped reversed filter

Multi element mapped reversed filter

Only lets elements, which mapped value is not found in given stream

  ('a' <> 'z').~.dropAllBy(_.Int % 10, ~~(1,3,7,4,6)).tp

  // Output
  ~(b, c, d, f, i, l, m, n, p, s, v, w, x, z)
Inherited from
_drop
Source
_drop.scala
inline def dropEvery[A](nTh: Int): ~[A]

Every Nth element reversed filter

Every Nth element reversed filter

Drops every nTh element

  (1 <> 10).~.dropEvery(3).tp   // Prints: ~(1, 2, 4, 5, 7, 8, 10)
Inherited from
_drop
Source
_drop.scala
inline def dropFirst[A](inline n: Int): ~[A]

Head reversed filter

Head reversed filter

Drops given number of first elements

  (1 <> 10).~.dropFirst(3).tp  // Prints  ~(4, 5, 6, 7, 8, 9, 10)
Inherited from
_drop
Source
_drop.scala
inline def dropLast[A](n: Int): ~[A]

Tail reversed filter

Tail reversed filter

Drops given number of elements coming last

  (1 <> 10).~.dropLast(3).tp  // Prints  ~(1, 2, 3, 4, 5, 6, 7)

Note: This method will block on unlimited streams

Inherited from
_drop
Source
_drop.scala
def dropOnly[A](v: A, vs: A*): ~[A]

Single value reversed filter

Single value reversed filter

Drops only specified value.

  (1 <> 4).~.dropOnly(3).tp

  // Output
  ~(1, 2, 4)

Note: dropOnly is more efficient than general filter, because there is no function involved.

Inherited from
_drop
Source
_drop.scala
def dropOnlyBy[A](f: A => B, vs: B*): ~[A]
Inherited from
_drop
Source
_drop.scala
inline def dropSame[A]: ~[A]

Duplicates reversed filter

Duplicates reversed filter

Drops elements equal to passed in prior position

Note: To generally get rid of all duplicates, the stream must be sorted to arrange duplicates in sequence

Inherited from
_drop
Source
_drop.scala
inline def dropSameBy[A](inline f: A => B): ~[A]

Mapped duplicates reversed filter

Mapped duplicates reversed filter

Drops elements, which evaluate to the same value as elements passed in prior position

Note: To generally get rid of all duplicates, the stream must be sorted by the mapping function

  (1 <> 100).~.dropSameBy(_.toString.length).tp

  // Output
  ~(1, 10, 100)
Inherited from
_drop
Source
_drop.scala
def dropVoid[A](using Info.Tag.Void[A]): ~[A]

Void value reversed filter

Void value reversed filter

Drops elements which test to be void

Inherited from
_drop
Source
_drop.scala
inline def dropWhile[A](inline f: A => Boolean): ~[A]

Coditional reversed head filter

Coditional reversed head filter

Discards first consecutive elements satisfying the condition

  def stream = (1 <> 5).~ ++ (1 <> 5)

  stream.tp                     // Prints ~(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

  stream.dropWhile(_ <= 3).tp   // Prints ~(4, 5, 1, 2, 3, 4, 5)

Note: Everything starting from the first non compliant element will be allowed (including later compliant elements)

Inherited from
_drop
Source
_drop.scala
def enablePreview[A]: ~[A] & ~.Preview[A]

Enables preview capabilities

Enables preview capabilities

Returns Stream.Preview, which allows to pre-load and inspect elements, even before they are read

  def strm : ~[String] = ???

  if(strm.enablePreview.previewSize > 1000) "Stream is over 1K".TP
Inherited from
_mutate
Source
_mutate.scala
def enableSize[A]: ~[A] & Size

Adds sizing information

Adds sizing information

If Stream already has sizing, this method is a simple cas t, otherwise, the elements might be buffered and counted.

Inherited from
_mutate
Source
_mutate.scala
def equalsAll[A](v: ~[A]): Boolean

Equal check

Equal check

Iterates both streams and compares all corresponding elements

Returns true if all are equal, `false`` otherwise

Inherited from
_evaluate
Source
_evaluate.scala
@targetName("equalsAll_Result")
def equalsAll_??[A](v: ~[A]): Result[true]

Equal check

Equal check

Iterates both streams and compares all corresponding elements

When first not equal pair is found, the problem result is returned

If all elements are equal, Result[true] is returned

(0 <> 10).~.equalsAll_??(0 <> 10).tp
// Prints: Result(true)

(0 <> 10).~.equalsAll_??(0 <>> 10).tp
// Prints: Result(Problem(Second stream has less elements))

((0 <> 5).~ + 7 + 8).equalsAll_??(0 <> 10).tp
// Prints: Result(Problem(Fail at index 6: 7 != 6))

Note: The returned problem contains message with basic description

Inherited from
_evaluate
Source
_evaluate.scala
def equalsStart[A](v: ~[A]): Boolean

Equal start check

Equal start check

Checks if starting elements of two streams (to a point where one stream ends) are equal

Inherited from
_evaluate
Source
_evaluate.scala
@targetName("equalsStart_Result")
def equalsStart_??[A](v: ~[A]): Result[true]

Equal start check

Equal start check

Checks if starting elements of two streams (to a point where one stream ends) are equal

(0 <> 10).~.equalsStart_??(0 <> 1000).tp
// Prints: Result(true)

(0 <> 1000).~.equalsStart_??(0 <> 10).tp
// Prints: Result(true)

((0 <> 5).~ + 7 + 8).equalsStart_??(0 <> 10).tp
// Prints: Result(Problem(Fail at index 6: 7 != 6))

Note: The returned problem result contains message with basic description

Inherited from
_evaluate
Source
_evaluate.scala
def exists[A](f: A => Boolean): Boolean

Exists check

Exists check

Returns true if there is an elemnet satisfying given predicate

Inherited from
_evaluate
Source
_evaluate.scala
inline def filter[A](inline f: A => Boolean): ~[A]

Legacy filter

Legacy filter

Filters Stream elements according to given function

  (0 <>> 10).~.filter(_ > 5).tp

  // Output
  ~(6, 7, 8, 9)

Note: take is usually used instead.

Inherited from
_filter
Source
__.scala
inline def FILTER[A](inline f: A => Boolean): ~[A]
Inherited from
_filter
Source
__.scala
def find[A](f: A => Boolean): A

Find value

Find value

Finds the first value accepted by given predicate

 (1 <> 1000).~.find(_ > 100).tp  // Prints 101

Note: If value is not found find fails, use find_? in most cases

Inherited from
_evaluate
Source
_evaluate.scala
@targetName("find_Opt")
def find_?[A](f: A => Boolean): Opt[A]

Optional find value

Optional find value

Finds the first value accepted by given predicate or returns void option if not found

(1 <> 1000).~.find_?(_ > 100).tp   // Prints Opt(101)

(1 <> 10).~.find_?(_ > 100).tp     // Prints Opt(\/)
Inherited from
_evaluate
Source
_evaluate.scala
@targetName("findPosition_Opt")
def findPosition_?[A](f: A => Boolean): Opt

Find index

Find index

Optionally returns index for the first element satisfying the predicate or Int.Opt(/) if none found

  (50 <> 500).~.findPosition_?(_ == 400)  // Retuns Int.Opt(350)
Inherited from
_evaluate
Source
_evaluate.scala
inline def FLAT_MAP[A, T, STM <: Any[T]](inline f: A => ~[B])(using inline s: Shape.OfStream.Tag[B, STM]): STM

Heavy flat map

Heavy flat map

FLAT_MAP is functionally equivalent to flatMap, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_map
Source
_map.scala
inline def flatMap[A, T, STM <: Any[T]](inline f: A => ~[B])(using inline s: Shape.OfStream.Tag[B, STM]): STM

Flat map

Flat map

Creates a new Stream by applying given function to all elements of current Stream and concatenating the results

(1 <> 3).~.flatMap(i => ~~(i, i*10, i*100)).tp

// Output
~(1, 10, 100, 2, 20, 200, 3, 30, 300)
Inherited from
_map
Source
_map.scala
inline def flatten[A, T, STM <: Any[T]](using inline f: A => Able.~[T], inline s: Shape.OfStream.Tag[T, STM]): STM

Converts a stream of streams into a flat stream

Converts a stream of streams into a flat stream

val vs: ~[~[Char]] = ~~(
  'a' <> 'd',
  Pack('x', 'y', 'z'),
  Vector('v', 'e', 'c', 't', 'o', 'r'))

vs.flatten.tp // Prints ~(a, b, c, d, x, y, z, v, e, c, t, o, r)
Inherited from
_map
Source
_map.scala
def fold[A](start: A)(f: (A, A) => A): A

Fold

Fold

Folds elements with a binary function

    // Calculate sum of first 1000 Ints

    (1 <> 1000).~.fold(0)(_ + _) // Returns 500500
Value Params
f

binary function to fold elements with

start

seed value to start with

Inherited from
_aggregate
Source
_aggregate.scala
inline def FOLD[A](inline start: A)(inline f: (A, A) => A): A

Heavy Fold

Heavy Fold

Folds elements with a binary function

FOLD is functionally equivalent to fold, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_aggregate
Source
_aggregate.scala
inline def FOLD_AS[A](inline start: B)(inline f: (B, A) => B): B

Heavy Fold and convert

Heavy Fold and convert

Folds and converts elements with a binary function

FOLD_AS is functionally equivalent to foldAs, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_aggregate
Source
_aggregate.scala
def foldAs[A](start: B)(f: (B, A) => B): B

Fold and convert

Fold and convert

Folds and converts elements with a binary function

    // Calculate sum of first 1000 Ints

    (1 <> 1000).~.foldAs(0L)(_ + _) // Returns 500500
Value Params
f

binary function to fold elements with

start

seed value to start with

Inherited from
_aggregate
Source
_aggregate.scala
inline def FOREACH[A](inline f: A => U): Unit

Heavy process stream

Heavy process stream

Applies given function to each stream element

FOREACH is functionally equivalent to foreach, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_process
Source
_process.scala
def foreach[A](f: A => U): Unit

Process stream

Process stream

Applies given function to each stream element

 ('A' <> 'C').~.foreach(_.tp)

 // Output
 A
 B
 C
Inherited from
_process
Source
_process.scala
def foreachIndexed[A](f: (Int, A) => U, start: Int): Unit

For each indexed

For each indexed

Calls given function with counter

 ('A' <> 'C').~.foreachIndexed((i,v) => "Element " + i + " = " + v tp(), 1)

 // Output
 Element 1 = A
 Element 2 = B
 Element 3 = C
Value Params
start

starting value for indexing

Inherited from
_process
Source
_process.scala
def fornil[A](f: => U): Unit

Run for nonexistent value

Run for nonexistent value

Runs given function only if stream is empty.

This operation is rarely useful and is provided for consistency.

Use peekEmpty instead, it can be combined with other processing

Inherited from
_process
Source
_process.scala
inline def fromEnumeration[A](inline v: Enumeration[A]): ~[A]

Constructor from Enumeration

Constructor from Enumeration

Inherited from
_default
Source
_default.scala
inline def fromIterable[A](inline v: Iterable[A]): ~[A]

Explicit constructor from Iterable

Explicit constructor from Iterable

Note: There is also global implicit conversion from Iterable to Stream

Inherited from
_default
Source
_default.scala
inline def fromIterableOnce[A](inline v: IterableOnce[A]): ~[A]

Explicit constructor from IterableOnce

Explicit constructor from IterableOnce

Note: There is also global implicit conversion from IterableOnce to Stream

Inherited from
_default
Source
_default.scala
inline def fromIterator[A](inline v: Iterator[A]): ~[A]

Explicit constructor from Iterator

Explicit constructor from Iterator

Note: There is also global implicit conversion from Iterator to Stream

Inherited from
_default
Source
_default.scala
inline def fromProduct(inline v: Product): ~[(String, Any)]

Constructor from Product

Constructor from Product

Inherited from
_default
Source
_default.scala
inline def fromSpliterator[A](inline v: Spliterator[A]): ~[A]

Constructor from Spliterator

Constructor from Spliterator

Inherited from
_default
Source
_default.scala
inline def group[A](inline f: (A, A) => Boolean, inline peek: (A, Boolean) => U): ~[~[A]]

Group by test

Group by test

Puts elements in the same group based on a function test for every two consecutive elements

   // Putting Ints into groups of 3

   (0 <> 20).~.group(_ / 3 == _ / 3).print

   // Output
   ---------------
   ?
   ---------------
   ~(0, 1, 2)
   ~(3, 4, 5)
   ~(6, 7, 8)
   ~(9, 10, 11)
   ~(12, 13, 14)
   ~(15, 16, 17)
   ~(18, 19, 20)
   ---------------
Value Params
f

function for two consecutive elements. if 'false' is returned, the second tested element will start a new group

peek

side-effect convenience function will run for each element. Boolean parameter indicates if the element starts a new group

Inherited from
_group
Source
_group.scala
inline def group[A]: ~[~[A]]

Simple grouping

Simple grouping

Puts consecutive elements in the same group if they are equal

   def stream =  ~~(1, 2, 3).repeat(3)

   stream.tp           // Prints ~(1, 1, 1, 2, 2, 2, 3, 3, 3)

   stream.group.print  // Prints  ------------
                                ?
                                ------------
                                ~(1, 1, 1)
                                ~(2, 2, 2)
                                ~(3, 3, 3)
                                ------------

Note: Non consecutive equal elements will end up in different groups. Prior ordering might be needed

Inherited from
_group
Source
_group.scala
inline def groupBy[A](inline f: A => Any, inline more: A => Any*): ~[~[A]]

Grouping on properties

Grouping on properties

Puts consecutive elements in the same group if all the specified properties are equal

When properties change, a new group is started

    ('#' <> '|').~.groupBy(_.isLetter, _.isDigit).print

   // Output
   ---------------------------------------------------------------------------------
   ?
   ---------------------------------------------------------------------------------
   ~(#, $, %, &, ', (, ), *, +, ,, -, ., /)
   ~(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
   ~(:, ;, <, =, >, ?, @)
   ~(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z)
   ~([, \, ], /\, _, `)
   ~(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, p, t, u, v, w, x, y, z)
   ~({, ~)
   ---------------------------------------------------------------------------------
Value Params
properties

a set of functions, each indicating element property

Inherited from
_group
Source
_group.scala
inline def groupEvery[A](inline cnt: Int): ~[~[A]]

Fixed size groups

Fixed size groups

Puts consecutive elements into fixed size groups

('a' <> 'z').~.groupEvery(8).print

// Output
-------------------------
?
-------------------------
~(a, b, c, d, e, f, g, h)
~(i, j, k, l, m, n, o, p)
~(q, r, p, t, u, v, w, x)
~(y, z)
-------------------------
Inherited from
_group
Source
_group.scala
inline def groupWith[A](f: A => B): ~[(B, ~[A])]

Grouping on a property

Grouping on a property

Puts consecutive elements in the same group if their properties are equal

  (0 <> 20).~.groupWith(_ / 3).print

  // Output
  -- -------------
  _1 _2
  -- -------------
  0  ~(0, 1, 2)
  1  ~(3, 4, 5)
  2  ~(6, 7, 8)
  3  ~(9, 10, 11)
  4  ~(12, 13, 14)
  5  ~(15, 16, 17)
  6  ~(18, 19, 20)
  -- -------------

Note: groupWith also returns the groupped property value (unlike groupBy)

Value Params
properties

a set of functions, each indicating an element property

Inherited from
_group
Source
_group.scala
def hideSizeData[A]: ~[A]

Loose size information

Loose size information

Many streams return ''sizeLong_?'', knowing their current size

hideSizeData drops sizing information, so some optimizations will not be available

This is primarily for testing and debugging

Inherited from
_mutate
Source
_mutate.scala
def isEvery[A](f: A => Boolean): Boolean

Forall check

Forall check

Returns true if every single element satisfies the given predicate

Inherited from
_evaluate
Source
_evaluate.scala
def iterator[A]: Iterator[A]

Iterator view

Iterator view

Wraps current stream as scala.collection.Iterator

Inherited from
_transformTo
Source
_transformTo.scala
inline def join[A](inline v: A): ~[A]

Join element

Join element

Creates a new Stream with given element appended to current Stream

  (1 <> 5).~.join(99).join(100).tp

  // Output
  ~(1, 2, 3, 4, 5, 99, 100)
Inherited from
_extend
Source
_extend.scala
inline def joinAll[A](inline v: ~[A]): ~[A]

Join all

Join all

Creates a new Stream with given elements appended to current Stream

  ('1' <> '9').~.joinAll('a' <> 'd').joinAll('A' <> 'D').tp

  // Output
  ~(1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, A, B, C, D)
Inherited from
_extend
Source
_extend.scala
inline def joinAllAt[A](inline index: Int, inline v: ~[A]): ~[A]

Join all at position

Join all at position

Creates a new Stream with given elements inserted into current Stream at given index

If index is out of range, the elements are prepended or appended

   ('a' <> 'f').~.joinAllAt(3, 'X' <> 'Z').tp

   // Output
   ~(a, b, c, X, Y, Z, d, e, f)
Inherited from
_extend
Source
_extend.scala
inline def joinAt[A](inline index: Int, inline v: A): ~[A]

Join element at position

Join element at position

Creates a new Stream with given element inserted into current Stream at given index

If index is out of range, the element is prepended or appended

 ('a' <> 'd').~.joinAt(2, 'X').tp

  // Output
  ~(a, b, X, c, d)
Inherited from
_extend
Source
_extend.scala
def last[A]: A

Last element

Last element

Returns the last stream element

Fails if empty

Inherited from
_evaluate
Source
_evaluate.scala
@targetName("last_Opt")
def last_?[A]: Opt[A]

Last element

Last element

Optionally returns the last element or Opt(/)

Inherited from
_evaluate
Source
_evaluate.scala
def load[A]: ~[A] & Size

Preload all

Preload all

Immediately loads all stream elements into memory, so they are no longer dependent on underlying sources.

  def strm : ~[String] = ???

  strm.load

  // is functionally same as

  strm.toBuffer.~
Inherited from
_mutate
Source
_mutate.scala
def makeString[A](sep: String)(using t: Info.Tag.Doc[A]): String

Convert ot String

Convert ot String

The result is a concatenation of all elements with given separator

   ('a' <> 'j').~.makeString()              // Returns abcdefghij

   ('a' <> 'j').~.makeString("|")           // Returns a|b|c|d|e|f|g|h|i|j

Inherited from
_transformTo
Source
_transformTo.scala
inline def map[A, T, STM <: Any[T]](inline f: A => B)(using inline s: Shape.OfStream.Tag[B, STM]): STM

Simple map

Simple map

Creates a new Stream where each element is a result of applying given function to current Stream elements

(0 <>> 26).~.map(i => ('a' + i).Char).tp

// Output
~(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)
Inherited from
_map
Source
_map.scala
inline def MAP[A, T, STM <: Any[T]](inline f: A => B)(using inline s: Shape.OfStream.Tag[B, STM]): STM

Heavy map

Heavy map

MAP is functionally equivalent to map, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_map
Source
_map.scala
@targetName("MAP_Opt")
inline def MAP_?[A, T, STM <: Any[T]](inline f: A => OPT)(using inline s: Shape.OfStream.Tag.Opt[T, OPT, STM]): STM

Heavy optional map

Heavy optional map

MAP_? is functionally equivalent to map_?, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_map
Source
_map.scala
@targetName("map_Opt")
inline def map_?[A, T, STM <: Any[T]](inline f: A => OPT)(using inline s: Shape.OfStream.Tag.Opt[T, OPT, STM]): STM

Optional map

Optional map

Creates a new Stream where each element is a result of applying given function to Stream elements. If the function returns void option, the element is dropped.

(1 <> 10).~.map_?(i => if(i>5) "Str_"+i else \/).tp

// Output
~(Str_6, Str_7, Str_8, Str_9, Str_10)

Pattern matching can be used, but the last void case must always be present:

(0 <>> 26).~.map_?{
 case i if(i%2==0) => ('a' + i).Char
 case _            => \/
}.tp

// Output
~(a, c, e, g, i, k, m, o, q, s, u, w, y)

Note:

  • map_? is functionally similar to collect, but is faster (PartialFunction has to be evaluated twice)
  • map_? can return specialized stream result, but boxing might happen during mapping
  • mapRaw_? is trully unboxed for raw types
Inherited from
_map
Source
_map.scala
@targetName("max")
def max[A](using Ordering[A]): A

Maximum

Maximum

Computes maximum value

Fails for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("max_Opt")
def max_?[A](using c: Ordering[A]): Opt[A]

Optional maximum

Optional maximum

Computes maximum value or returns void option for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("maxBy")
def maxBy[A](f: A => B)(using Ordering[B]): A

Maximum by property

Maximum by property

Computes maximum value based on given function

Fails for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("maxBy_Opt")
def maxBy_?[A](f: A => B)(using c: Ordering[B]): Opt[A]

Optional maximum by property

Optional maximum by property

Computes maximum value based on given function or returns void option for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("min")
def min[A](using Ordering[A]): A

Minimum

Minimum

Computes minimum value

Fails for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("min_Opt")
def min_?[A](using c: Ordering[A]): Opt[A]

Optional minimum

Optional minimum

Computes minimum value or returns void option for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("minBy")
def minBy[A](f: A => B)(using Ordering[B]): A

Minimum by property

Minimum by property

Computes minimum value based on given function

Fails for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("minBy_Opt")
def minBy_?[A](f: A => B)(using c: Ordering[B]): Opt[A]

Optional minimum by property

Optional minimum by property

Computes minimum value based on given function or returns void option for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("nonEmpty_Opt")
def nonEmpty_?[A]: Opt[~[A]]

Non empty option Optionally returns stream, if it is not empty.

Non empty option Optionally returns stream, if it is not empty.

Note: If stream does not have sizing information, this method will immediately preload at lease the first element.

Inherited from
_mutate
Source
_mutate.scala
def parallel[A]: ~.Flow[A]

Parallel

Parallel

Returns Stream.Flow with parallel execution

Each consecutive element will be sent to a new thread for processing

  (1 <> 5).~
     .parallel
     .map("Value: " + _ + "\t" + Thread.currentThread.getName)
     .foreach(println)

  // Possible Output
  Value: 1    ForkJoinPool.commonPool-worker-9
  Value: 3    ForkJoinPool.commonPool-worker-11
  Value: 2    main
  Value: 4    ForkJoinPool.commonPool-worker-2
  Value: 5    ForkJoinPool.commonPool-worker-4
Inherited from
_parallel
Source
_parallel.scala
def parallelIf[A](v: Boolean): ~.Flow[A]

Conditionally parallel

Conditionally parallel

Returns Stream.Flow with parallel or sequential implementation, depending on given parameter

   (1 <> 50).~.parallelIf(true).isParallel   // Returns true

   (1 <> 50).~.parallelIf(false).isParallel  // Returns false
Inherited from
_parallel
Source
_parallel.scala
def parallelIfOver[A](threshold: Int): ~.Flow[A]

Conditionally parallel

Conditionally parallel

Returns Stream.Flow with parallel or sequential implementation, depending on stream having element count equal or greater than given ''threshold''

  (1 <> 50).~.parallelIfOver(100).isParallel   // Returns false

  (1 <> 200).~.parallelIfOver(100).isParallel  // Returns true
Inherited from
_parallel
Source
_parallel.scala
def parallelWithPriority[A](p: Priority, parallelism: Int): ~.Flow[A]

Parallel with Priority

Parallel with Priority

This is very expensive operation, because it creates a custom thread pool. It only sutable for long running streams

   (1 <> 100).~.parallelWithPriority(MIN, 4).foreach(v => ())

   (1 <> 100).~.parallelWithPriority(MAX).foreach(v => ())

   (1 <> 100).~.parallelWithPriority(J.Priority(5), 4).foreach(v => ())

Note: parallelism determines how many parallel threads are allowed. Default value is CPU core count minus 1

Inherited from
_parallel
Source
_parallel.scala
inline def partition[A](inline p: A => Boolean, inline more: A => Boolean*): ~[~[A]]

Predicate grouping

Predicate grouping

All stream elements are grouped by given predicates, which are applied in sequence. Thus if an element is accepted into a group, it will not be evaluated by the rest of the filters.

The resulting stream size will be equal to the number of predicates plus one. The last group will hold spill over elements, not accepted by any predicate. Groups can be empty.

val ~~(odd,even) = (1 <> 10).~.partition(_ % 2 == 1)

odd.tp
even.tp

// Age groups
(1 <> 80).~.partition(_ <= 12, _ in 13 <> 19, _ < 30, _ in 30 <> 40, _ < 50, _ < 65).print
// Output
~(1, 3, 5, 7, 9)
~(2, 4, 6, 8, 10)

-------------------------------------------------------------------
?
-------------------------------------------------------------------
~(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
~(13, 14, 15, 16, 17, 18, 19)
~(20, 21, 22, 23, 24, 25, 26, 27, 28, 29)
~(30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40)
~(41, 42, 43, 44, 45, 46, 47, 48, 49)
~(50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64)
~(65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80)
-------------------------------------------------------------------
Inherited from
_group
Source
_group.scala
inline def peek[A](inline f: A => U): ~[A]

Inspect

Inspect

The given function will be run with every passing stream element.

  (1 <> 5).~.peek(_.tp).drain

  // Output
  1
  2
  3
  4
  5
Inherited from
_peek
Source
_peek.scala
def peekEmpty[A](f: => U): ~[A]

Peek empty

Peek empty

The given function is executed once, only if stream is empty

  (1 <> 10).~.drop(_ > 0).peekEmpty("Stream is empty".tp).drain

  // Output
  Stream is empty
Inherited from
_peek
Source
_peek.scala
def peekEnd[A](f: (Int, Length) => U): ~[A]

Peek end

Peek end

The given function is executed once, when stream is exhausted

The function receives total element count and Time.Length, it took for all elements to pass

  (1 <> 10).~
    .peek(_ => J.sleep(100.Millis))
    .peekEnd((cnt,time) => "Elements: "+cnt+"  total time: "+time.tag tp())
    .drain

  // Output
  Elements: 10  total time: 0.904106700 sec

Note: This will not run for empty streams

Inherited from
_peek
Source
_peek.scala
def peekEvents[A](f: Event => U): ~[A]

Custom events

Custom events

Allows to setup Stream.Custom.Events multiple monitoring events

 (1 <> 1000).~
   .peek(_ => J.sleep(5.Millis))
   .peekEvents(e => {
     e.onBeforeFirst(t   => "Started at: "+ t.dayTime.tag tp())
     e.onEvery(1.Second, (c,t) => "  Processed "+c+" in "+t.tag tp())
     e.onAfterLast((c,t) => "Finished in: "+ t.tag + ",  Element count: " + c tp())
   })
   .drain

 // Output

 Started at: 14:05:39.333
   Processed 187 in 1.018583400 sec
   Processed 371 in 2.020508100 secs
   Processed 557 in 3.021843300 secs
   Processed 743 in 4.023837400 secs
   Processed 928 in 5.026982 secs
 Finished in: 5.411673300 secs, Element count: 1000
Inherited from
_peek
Source
_peek.scala
inline def peekIndexed[A](inline f: (Int, A) => U, inline start: Int): ~[A]

Indexed peek

Indexed peek

The given function will be executed with every passing element and its index.

  ('a' <> 'f').~.peekIndexed((i,c) => (""+i+" : "+c).tp, 1).drain

  // Output
  1 : a
  2 : b
  3 : c
  4 : d
  5 : e
  6 : f

Note. By default indexing starts with 0, but it can be specified

Inherited from
_peek
Source
_peek.scala
def peekMonitor[A](v: Monitor): ~[A]

Custom monitor

Custom monitor

Adds pre-build Stream.Custom.Event.Monitor

If passed monitor tests to be void (.isEmpty), the operation is ignored

Inherited from
_peek
Source
_peek.scala
def peekStart[A](f: Time => U): ~[A]

Peek start

Peek start

The given function is executed once, just before the first elements is about to pass.

  ('a' <> 'f').~.peekStart(time => "Started at: "+time).drain

Note: This will not run for empty streams

Inherited from
_peek
Source
_peek.scala
def printId[A](using Info.Tag.Doc[A]): Unit

Print to console with rows indexed

Print to console with rows indexed

Same as regular print, but with added index as first column identifying the object


('A' <> 'F').~.map(v => (v.Int, v)).print

// Output
----------------- -- --
Id                _1 _2
----------------- -- --
scala.Tuple2@dzkr 65 A
scala.Tuple2@zn1  66 B
scala.Tuple2@71j3 67 C
scala.Tuple2@562u 68 D
scala.Tuple2@c8tt 69 E
scala.Tuple2@p0m8 70 F
----------------- -- --
Inherited from
_print
Source
_print.scala
def process[A](foreachFun: A => U, fornilFun: => W): Unit

Process elements or empty case

Process elements or empty case

Applies given function to each stream element or runs second function when stream is empty

 ('A' <>> 'A').~.process(_.tp, "Empty".tp)

 // Output
 Empty
Inherited from
_process
Source
_process.scala
@targetName("range")
def range[A](using Ordering[A]): <>[A]

Range

Range

Computes value range

Fails for empty streams

Inherited from
_calculate
Source
_calculate.scala
@targetName("range_Opt")
def range_?[A](using c: Ordering[A]): Opt[<>[A]]

Optional range

Optional range

Computes value value or returns void option for empty streams

Inherited from
_calculate
Source
_calculate.scala
inline def raw[A, STM <: Raw[A]](using inline s: Shape.OfStream.Tag.Raw[A, STM]): STM

Specialized stream

Specialized stream

Converts current stream into specialized on underlying primitive data. If stream is already specialized, the conversion is a simple cas t.

   val s  : ~[Int] = 1 <> 10

   val ss : Int.~  = s.raw

Note: If underlying type is not primitive, the method will not compile

Inherited from
_mutate
Source
_mutate.scala
inline def read[A]: A

Next element

Next element

Delivers next stream element

 val s : ~[Char] = 'A' <> 'Z'

 s.read.tp  // Prints A
 s.read.tp  // Prints B
 s.read.tp  // Prints C

Note: If stream is empty, read will fail. So, use a safer read_? in most cases

Inherited from
_read
Source
_read.scala
@targetName("read_Stream")
inline def read_~[A](inline cnt: Int): ~[A] & Size

Read many elements

Read many elements

Immediatelly removes given number of elements from current stream and returns them as a new stream

 val s : ~[Int] = 1 <> 12

 s.read_~(3).tp  // Prints ~(1, 2, 3)
 s.read_~(4).tp  // Prints ~(4, 5, 6, 7)
 s.read_~(7).tp  // Prints ~(8, 9, 10, 11, 12)
 s.read_~(8).tp  // Prints ~()

Note: If requested number of elements is not available, the number returned is less (0 if empty)

Inherited from
_read
Source
_read.scala
@targetName("read_Opt")
inline def read_?[A]: Opt[A]

Next optional element

Next optional element

Delivers next stream element or void option if stream is empty

 val s : ~[Char] = 'A' <> 'C'

 s.read_?.tp  // Prints Opt(A)
 s.read_?.tp  // Prints Opt(B)
 s.read_?.tp  // Prints Opt(C)
 s.read_?.tp  // Prints Opt(\/)
Inherited from
_read
Source
_read.scala
def reduce[A](f: (A, A) => A): A

Reduce

Reduce

Folds elements with a binary function

   // Calculate sum of first 1000 Ints

   (1 <> 1000).~.reduce(_ + _) // Returns 500500

Note. Threre is no default value, and if stream is empty, operation fails. Use reduce_? as safer option

Value Params
f

binary function to fold elements with

Inherited from
_aggregate
Source
_aggregate.scala
inline def REDUCE[A](inline f: (A, A) => A): A

Heavy reduce

Heavy reduce

Folds elements with a binary function

REDUCE is functionally equivalent to reduce, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_aggregate
Source
_aggregate.scala
@targetName("reduce_Opt")
def reduce_?[A](f: (A, A) => A): Opt[A]

Optional reduce

Optional reduce

Folds elements with a binary function or returns empty option when stream is empty

    // Calculate sum of first 1000 Ints

    (1 <> 1000).~.reduce_?(_ + _) // Returns Opt(500500)
Value Params
f

binary function to fold elements with

Inherited from
_aggregate
Source
_aggregate.scala
@targetName("REDUCE_Opt")
inline def REDUCE_?[A](inline f: (A, A) => A): Opt[A]

Heavy optional reduce

Heavy optional reduce

Folds elements with a binary function

REDUCE_? is functionally equivalent to reduce_?, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_aggregate
Source
_aggregate.scala
inline def ref[A]: ~[A]

Generalize

Generalize

If stream is specialized it will be up-ca st to general Val.Stream type, so further operations will be general (unless they are specialized, like map)

  val special : Int.><  = (1 <> 10).~.><

  val general : ><[Int] = (1 <> 10).~.ref.><

  special.getClass.tp // Prints class scalqa.def.int.g.Pack

  general.getClass.tp // Prints class scalqa.val.pack.z.ArrayPack

Note: This is a true zero cost operation. It does not change byte code (only compiler context)

Inherited from
_mutate
Source
_mutate.scala
inline def repeat[A](inline times: Int): ~[A]

Repeat elements

Repeat elements

Creates a new Stream where each elements from current Stream is repeated given number of times

 (0 <> 2).~.repeat(3).tp

 // Output
 ~(0, 0, 0, 1, 1, 1, 2, 2, 2)
Inherited from
_extend
Source
_extend.scala
inline def reverse[A]: ~[A]

Reverse order

Reverse order

Re-arranges all elements is reverse order

('A' <> 'F').~.reverse.tp  // Prints ~(F, E, D, C, B, A)
Inherited from
_mutate
Source
_mutate.scala
inline def reverseEvery[A](inline size: Int): ~[A]

Reverse order in segments

Reverse order in segments

Reverses order of elements within segments of fixed size

(1 <> 15).~.reverseEvery(5).tp

(1 <> 15).~.reverseEvery(5).reverseEvery(3).reverseEvery(7).tp

// Output
~(5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 15, 14, 13, 12, 11)

~(7, 2, 1, 10, 5, 4, 3, 12, 11, 6, 15, 14, 9, 8, 13)

Use Case: Predefined Shuffle

For testing purposes it is often required to get elements in random order. However the order cannot be completely random, if we want to replicate bugs

reverseEvery can shuffle elements in a predefined order which looks random

Inherited from
_mutate
Source
_mutate.scala
inline def shuffle[A]: ~[A]

Randomize order

Randomize order

Re-arranges elements is random order

Inherited from
_mutate
Source
_mutate.scala
@targetName("size_Opt")
inline def size_?[A]: Opt

Optional size

Optional size

Many streams can return their current element count. If the information is not available, void option is returned

Note: If size is known, but exceeds integer range, void option is returned. For theses cases use sizeLong_?

 var s = ('a' <> 'z').~

 s.size_?.tp         // Prints Int.Opt(26)

 s = s.take(_ > 10)  // static sizing is lost

 s.size_?.tp         // Prints Int.Opt(\/)
Inherited from
_info
Source
_info.scala
@targetName("sizeLong_Opt")
inline def sizeLong_?[A]: Opt

Optional long size

Optional long size

Many streams can return their current element count. If the information is not available, void option is returned

var s = (Int.min.Long <> Int.max.Long).~

s.sizeLong_?.tp    // Prints Long.Opt(4294967296)

s = s.take(_ > 10) // static sizing is lost

s.sizeLong_?.tp    // Prints Long.Opt(\/)
Inherited from
_info
Source
_info.scala
inline def sliding[A](inline size: Int, inline step: Int): ~[~[A]]

Sliding group view

Sliding group view

Example: group size 3 with step 1

 ('a' <> 'g').~.sliding(3).print

 // Output
 ----------
 ?
 ----------
 ~(a, b, c)
 ~(b, c, d)
 ~(c, d, e)
 ~(d, e, f)
 ~(e, f, g)
 ----------

Example: group size 4 with step 2

 ('a' <> 'g').~.sliding(4,2).print

 // Output
 -------------
 ?
 -------------
 ~(a, b, c, d)
 ~(c, d, e, f)
 ~(e, f, g)
 -------------
Inherited from
_group
Source
_group.scala
inline def sort[A](using inline o: Ordering[A]): ~[A]

Sort

Sort

Sorts stream elements with given Ordering

  ~~(5, 1, 4, 2, 3).sort.tp  // Prints ~(1, 2, 3, 4, 5)
Inherited from
_order
Source
_order.scala
inline def sortBy[A](f1: A => B, f2: A => C, f3: A => D)(using Ordering[B], Ordering[C], Ordering[D]): ~[A]

Sort by three properties

Sort by three properties

Sorts stream on first property, then if indeterminate on second, etc...

Inherited from
_order
Source
_order.scala
inline def sortBy[A](f1: A => B, f2: A => C)(using Ordering[B], Ordering[C]): ~[A]

Sort by two properties

Sort by two properties

Sorts stream on first property, and then, if indeterminate on second

Inherited from
_order
Source
_order.scala
inline def sortBy[A](inline f: A => B)(using inline o: Ordering[B]): ~[A]

Sort by property

Sort by property

Sorts stream of elements based on a single property

  ~~("aaaa", "bb", "ccc", "d").sortBy(_.length).tp

  // Output
  ~(d, bb, ccc, aaaa)
Inherited from
_order
Source
_order.scala
inline def sortReversed[A](using inline o: Ordering[A]): ~[A]

Sort reversed

Sort reversed

Reverse sorts stream elements with given Ordering

  ~~(5, 1, 4, 2, 3).sortReversed.tp  // Prints ~(5, 4, 3, 2, 1)
Inherited from
_order
Source
_order.scala
inline def splitAt[A](inline positions: Int*): ~[~[A]]

Positional split

Positional split

Splits Stream at specified positions

val ~~(s1, s2, s3) = (0 <> 20).~.splitAt(5, 15)

s1.tp   // Prints ~(0, 1, 2, 3, 4)
s2.tp   // Prints ~(5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
s3.tp   // Prints ~(15, 16, 17, 18, 19, 20)

Note. The same could be accomplished with read_~

```

val s3 = (0 <> 20).~ val s1 = s3.read_~(5) val s2 = s3.read_~(10) ```

Inherited from
_group
Source
_group.scala
@targetName("sum")
def sum[A](using n: Math[A]): A

Sum

Sum

Calculates sum of all values

For empty stream returns zero

    (1 <> 1000).~.sum.tp // Prints 500500
Inherited from
_calculate
Source
_calculate.scala
@targetName("sum_Opt")
def sum_?[A](using n: Math[A]): Opt[A]

Optional sum

Optional sum

Calculates sum of all values or returns void option for empty streams

    (1 <> 1000).~.sum_?.tp // Prints Opt(500500)
Inherited from
_calculate
Source
_calculate.scala
def sumFew[A](fb: A => Opt[B], fc: A => Opt[C], fd: A => Opt[D], fe: A => Opt[E], ff: A => Opt[F])(using nb: Math[B], nc: Math[C], nd: Math[D], ne: Math[E], nf: Math[F]): (B, C) | (B, C, D) | (B, C, D, E) | (B, C, D, E, F)

Multi sum

Multi sum

Simultaneously computes up to 5 sum values for properties specified by given functions

Returns tuple of appropriate size with values corresponding to the given mappings

For empty Stream returned tuple will hold zeros

 (1 <> 1000).~.sumFew(_ * 10, _ * 100).tp  // Prints (5005000, 50050000)

 val (first, second, third) = (1 <> 1000).~.sumFew(v => v, _ * 10, _ * 100)

 first.tp     // Prints 500500
 second.tp    // Prints 5005000
 third.tp     // Prints 50050000
Inherited from
_calculate
Source
_calculate.scala
inline def TAKE[A](inline f: A => Boolean): ~[A]

Heavy filter

Heavy filter

Filters Stream elements according to given function

TAKE is functionally equivalent to take, but is fully inlined. It makes compiled code larger, but guarantees the best possible performance on large streams.

Inherited from
_take
Source
_take.scala
inline def take[A](inline f: A => Boolean): ~[A]

Main filter

Main filter

Only takes Stream elements satisfying the given function

  (0 <>> 10).~.take(_ > 5).tp

  // Output
  ~(6, 7, 8, 9)

Note: Traditional method filter is also available and can be used, but take is prefferable in most cases.

Inherited from
_take
Source
_take.scala
@targetName("take_Range")
inline def take_<>[A](inline i: <>): ~[A]

Range filter

Range filter

Only allows elements withing specified sequencial range

  ('a' <> 'z').~.take_<>(1 <> 7).tp

  // Output
  ~(b, c, d, e, f, g, h)

Note: Sequence indexing starts from 0

Inherited from
_take
Source
_take.scala
def takeAll[A](v: ~[A]): ~[A]

Multi element filter

Multi element filter

Only lets elements equal to the found in given stream

  ('a' <> 'z').~.takeAll(~~('z','x','b')).tp   // Prints ~('b','x','y')

  ('a' <> 'z').~.takeAll('b' <> 'f') .tp       // Prints ~('b','c','d','e','f')
Inherited from
_take
Source
_take.scala
def takeAllBy[A](f: A => B, v: ~[B]): ~[A]

Multi element mapped filter

Multi element mapped filter

Only lets elements, which mapped value is found in given stream

  ('a' <> 'z').~.takeAllBy(_.Int % 10, ~~(1,3,7)).tp

  // Output
  ~(a, e, g, k, o, q, u, y)
Inherited from
_take
Source
_take.scala
inline def takeEvery[A](inline nTh: Int): ~[A]

Every Nth element filter

Every Nth element filter

Only lets every nTh element

  (1 <> 20).~.takeEvery(4).tp   // Prints: ~(4, 8, 12, 16, 20)
Inherited from
_take
Source
_take.scala
inline def takeFirst[A](n: Int): ~[A]

Head filter

Head filter

Only takes given number of first elements

  (1 <> 10).~.takeFirst(3).tp  // Prints  ~(1, 2, 3)
Inherited from
_take
Source
_take.scala
inline def takeIndexed[A](inline f: (Int, A) => Boolean, inline start: Int): ~[A]

Indexed filter

Indexed filter

Only lets elements satisfying the given function, which also accepts element sequential index

  ('a' <> 'z').~.takeIndexed((i, _) => i >= 2 && i <= 7, 1).tp

  // Output
  ~(b, c, d, e, f, g)

Note: By default indexing starts from 0, but starting value can also be explicitly specified.

Inherited from
_take
Source
_take.scala
inline def takeLast[A](inline n: Int): ~[A]

Tail filter

Tail filter

Only takes given number of elements coming last

  (1 <> 10).~.takeLast(3).tp  // Prints  ~(8, 9, 10)

Note: This method will block on unlimited streams

Inherited from
_take
Source
_take.scala
def takeOnly[A](v: A, vs: A*): ~[A]

Single value filter

Single value filter

Filters only specified value.

  (0 <>> 10).~.takeOnly(5).tp

  // Output
  ~(5)

Note: takeOnly is more efficient than general filter, because there is no function involved.

Inherited from
_take
Source
_take.scala
def takeOnlyBy[A](f: A => B, v: B*): ~[A]
Inherited from
_take
Source
_take.scala
inline def takeType[A](using inline t: ClassTag[B]): ~[B]

Type filter

Type filter

Only lets elements of specified type

  ~~(1, '2', "3", new Object(), 0.0).takeType[String].tp  // Prints: ~(3)
Inherited from
_take
Source
_take.scala
inline def takeWhile[A](inline f: A => Boolean): ~[A]

Conditional head filter

Conditional head filter

Only takes first consecutive elements satisfying the condition

  def stream = (1 <> 5).~ ++ (1 <> 5)

  stream.tp                     // Prints ~(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

  stream.takeWhile(_ <= 3).tp    // Prints ~(1, 2, 3)

Note: Everything starting from the first non compliant element will be discarded (including later compliant elements)

Inherited from
_take
Source
_take.scala
def toArray[A](using ClassTag[A]): Array[A]

Convert to Array

Convert to Array

Returns stream elements as Array

 val a : Array[Int] =  (1 <> 10).~.toArray
Inherited from
_transformTo
Source
_transformTo.scala
def toBuffer[A]: Buffer[A]

Convert to Buffer

Convert to Buffer

Returns stream elements as Buffer

Inherited from
_transformTo
Source
_transformTo.scala
def toIdx[A]: Idx[A]

Convert to Idx

Convert to Idx

Returns stream elements as Idx

Inherited from
_transformTo
Source
_transformTo.scala
inline def toJavaIterator[A]: Iterator[A]

Convert to Java Iterator

Convert to Java Iterator

Wraps current stream as java.util.Iterator

Inherited from
_transformTo
Source
_transformTo.scala
def toJavaList[A]: List[A]

Convert to Java List

Convert to Java List

Returns stream elements as java.util.List

Inherited from
_transformTo
Source
_transformTo.scala
inline def toJavaSpliterator[A](inline splitSize: Int): Spliterator[A]

Convert to Java Spliterator

Convert to Java Spliterator

Wraps current stream as java.util.Spliterator

Inherited from
_transformTo
Source
_transformTo.scala
def toJavaStream[A](parallel: Boolean): Stream[A]

Convert to Java Stream

Convert to Java Stream

Wraps current stream as java.util.stream.Stream

Inherited from
_transformTo
Source
_transformTo.scala
def toList[A]: List[A]

Convert to List

Convert to List

Returns stream elements as scala.collection.immutable.List

Inherited from
_transformTo
Source
_transformTo.scala
def toLookup[A, B]: Lookup[A, B]

Convert to Lookup

Convert to Lookup

Returns a stream of tuples with (Key,Value) pairs as Lookup

val intLookup : Lookup[Int,Char] = ('A' <> 'F').~.zipKey(_.Int).toLookup

intLookup.pair_~.tp   // Prints ~((69,E), (70,F), (65,A), (66,B), (67,C), (68,D))

val charLookup : Lookup[Char,Int] = ('A' <> 'F').~.zipValue(_.Int).toLookup

charLookup.pair_~.tp   // Prints ~((E,69), (F,70), (A,65), (B,66), (C,67), (D,68))
Inherited from
_transformTo
Source
_transformTo.scala
def toLookupBy[A](f: A => K): Lookup[K, A]
Inherited from
_transformTo
Source
_transformTo.scala
def toMap[A, B]: Map[A, B]
Inherited from
_transformTo
Source
_transformTo.scala
def toMapBy[A](f: A => K): Map[K, A]
Inherited from
_transformTo
Source
_transformTo.scala
def toProduct[A]: Product

Convert to Product

Convert to Product

Returns stream elements as scala.Product

Inherited from
_transformTo
Source
_transformTo.scala
def toSeq[A]: IndexedSeq[A]

Convert to Seq

Convert to Seq

Returns stream elements as scala.collection.immutable.IndexedSeq

Inherited from
_transformTo
Source
_transformTo.scala
def toSet[A]: StableSet[A]

Convert to unique collection

Convert to unique collection

Returns stream elements as StableSet

Inherited from
_transformTo
Source
_transformTo.scala
def toText[A](using t: Info.Tag.Doc[A]): String

Elements as multi-line String

Elements as multi-line String

Returns all elements as String formatted table

If elements implement Able.Info, each 'info' property value is placed in a different column

If elements implement scala.Product (like all Tuples), each Product element is placed in a different column

  ('a' <> 'e').~.map(v => (v + "1", v + "2", v + "3", v + "4", v + "5")).tp

  // Output
  -- -- -- -- --
  ?  ?  ?  ?  ?
  -- -- -- -- --
  a1 a2 a3 a4 a5
  b1 b2 b3 b4 b5
  c1 c2 c3 c4 c5
  d1 d2 d3 d4 d5
  e1 e2 e3 e4 e5
  -- -- -- -- --
Inherited from
_transformTo
Source
_transformTo.scala
def toVector[A]: Vector[A]

Convert to Vector

Convert to Vector

Returns stream elements as scala.collection.immutable.Vector

Inherited from
_transformTo
Source
_transformTo.scala
inline def transpose[A](using inline f: A => ~[B]): ~[~[B]]

Transpose

Transpose

Transposes matrix where rows become columns

 def stream : ~[~[Int]] = ~~(11 <> 15,
                             List(21, 22, 23, 24, 25),
                             Vector(31, 32, 33, 34, 35))

 stream.print

 stream.transpose.print

 // Output
 ---------------------
 ?
 ---------------------
 ~(11, 12, 13, 14, 15)
 ~(21, 22, 23, 24, 25)
 ~(31, 32, 33, 34, 35)
 ---------------------

 -------------
 ?
 -------------
 ~(11, 21, 31)
 ~(12, 22, 32)
 ~(13, 23, 33)
 ~(14, 24, 34)
 ~(15, 25, 35)
 -------------
Inherited from
_mutate
Source
_mutate.scala
inline def unfold[A](f: ~[A] => Opt[A]): ~[A]

Lazy generator

Lazy generator

Lazily unfolds next stream value with a function taking all prior values

If the given function returns void option, the stream ends

 // Unfolding Fibonacci Sequence

 (0 <> 1).~.unfold(_.takeLast(2).sum).takeFirst(20).tp

 // Output
 ~(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181)

Note: Method .takeFirst(20) is needed, because otherwise the stream will never end and would be hard to print out

Inherited from
_extend
Source
_extend.scala
inline def unzip[A](using inline f: A => (B, C)): (~[B], ~[C])

Unzips stream in two

Unzips stream in two

Unzips a stream of tupled values in two

 val pairs = ('a' <> 'g').~.zipValue(_.toUpper).><

 pairs.~.tp  // Prints ~((a,A), (b,B), (c,C), (d,D), (e,E), (f,F), (g,G))

 val (left, right) = pairs.~.unzip

 left.tp   // Prints ~(a, b, c, d, e, f, g)

 right.tp  // Prints ~(G, F, E, D, C, B, A)
Inherited from
_zip
Source
_zip.scala
inline def zip[A](inline that: ~[B]): ~[(A, B)]

Merge

Merge

Merges two streams in one, creating tuples of corresponding elements

  (1 <> 100).~.zip('A' <> 'D').tp  // Prints ~((1,A), (2,B), (3,C), (4,D))

If one of the streams is shorter, the excess elements are lost

Inherited from
_zip
Source
_zip.scala
inline def zipAll[A](inline that: ~[B], thisDflt: Opt[A], thatDflt: Opt[B]): ~[(A, B)]

Merge stream

Merge stream

Merges two streams in one, creating tuples of corresponding elements

If one of the streams is shorter, the provided defaults are used. If the default is not available, operation fails

  ('a' <> 'f').~.zip('A' <> 'H', '?', '?').tp

  // Output
  ~((a,A), (b,B), (c,C), (d,D), (e,E), (f,F), (?,G), (?,H))
Value Params
that

the stream to merge with this

thatDflt

if that Stream has fewer elements, ''thatDflt'' will be used to fill the voids. Fails if ''thatDflt'' is required, but not available

thisDflt

if this Stream has fewer elements, ''thisDflt'' will be used to fill the voids. Fails if ''thisDflt'' is required, but not available

Inherited from
_zip
Source
_zip.scala
inline def zipFoldAs[A](inline start: B, inline f: (B, A) => B): ~[(A, B)]

Merges current folding value

Merges current folding value

(1 <> 7).~.zipFoldAs(0L)(_ + _).print

// "Running Total" Output
-- --
?  ?
-- --
1  1
2  3
3  6
4  10
5  15
6  21
7  28
Inherited from
_zip
Source
_zip.scala
inline def zipIndex[A](inline start: Int): ~[(Int, A)]

Merge number Creates a new Stream with elements paired with their sequential position Note: Index is the first element in the resulting tuples.

Merge number Creates a new Stream with elements paired with their sequential position Note: Index is the first element in the resulting tuples.

   ('A' <> 'F').~.zipIndex('A'.toInt) tp  // Prints Stream((65,A), (66,B), (67,C), (68,D), (69,E), (70,F))
Value Params
start

index initial value

Inherited from
_zip
Source
_zip.scala
inline def zipIndex[A]: ~[(Int, A)]

Merge index

Merge index

Creates a new Stream with elements paired with their sequential position, starting at 0

  ('A' <> 'F').~.zipIndex.tp

  // Output

  ~((0,A), (1,B), (2,C), (3,D), (4,E), (5,F))

Note: Index is the first element in the resulting tuples

Inherited from
_zip
Source
_zip.scala
inline def zipKey[A](inline f: A => B): ~[(B, A)]

Merge property first

Merge property first

Creates a new Stream with elements paired with their property, defined by given function

The paired value is in the first tuple position

  ('A' <> 'F').~.zipKey(_.Int).tp  // Prints ~((65,A), (66,B), (67,C), (68,D), (69,E), (70,F))
Inherited from
_zip
Source
_zip.scala
inline def zipNext[A]: ~[(A, Opt[A])]

Merge with next

Merge with next

Creates new Stream with elements paired with the optional next element

  (1 <> 5).~.zipNext.tp  // Prints ~((1,Opt(2)), (2,Opt(3)), (3,Opt(4)), (4,Opt(5)), (5,Opt(\/)))
Inherited from
_zip
Source
_zip.scala
inline def zipPrior[A]: ~[(Opt[A], A)]

Merge with prior

Merge with prior

Creates new Stream with elements paired with the optional prior element

  (1 <> 5).~.zipPrior.tp  // Prints ~((Opt(\/),1), (Opt(1),2), (Opt(2),3), (Opt(3),4), (Opt(4),5))
Inherited from
_zip
Source
_zip.scala
inline def zipValue[A](inline f: A => B): ~[(A, B)]

Merge property

Merge property

Creates a new Stream with elements paired with their property, defined by given function

The paired value is in the second tuple position

  ('A' <> 'F').~.zipValue(_.Int).tp  // Prints ~((A,65), (B,66), (C,67), (D,68), (E,69), (F,70))
Inherited from
_zip
Source
_zip.scala