Link Search Menu Expand Document

Concatenation operation

Whenever you need to concatenate stream one after another you may use this operator. The leading stream though should be finite and be the type of FiniteStream<T>, another stream operand should be finite or infinite but the same type. Depending on the second argument type, the resulting stream will be either finite of type FiniteStream<T>, or infinite of type BeanStream<T>.

This is what is happening schematically, the stream are being read one after another:

[1, 2, 3, 4] .. [10, 12, 13] -> [1, 2, 3, 4, 10, 12, 13] 

The inline operator .. concatenate two streams, you may use them one-by-one as many as you like to concatenate more streams altogether:

// finite streams
val a = listOf(1, 2).input()
val b = listOf(3, 4, 5).input()
val c = listOf(10, 20, 30).input()
// infinite stream
val d = listOf(100, 200).input().stream(AfterFilling(0))

(a..b).asSequence(44100.0f).toList()
// results in stream [1, 2, 3, 4, 5]

(b..c).asSequence(44100.0f).toList()
// results in stream [3, 4, 5, 10, 20, 30]

(a..b..c).asSequence(44100.0f).toList()
// results in stream [1, 2, 3, 4, 5, 10, 20, 30]

(a..b..c..d).asSequence(44100.0f).take(15).toList()
// results in stream [1, 2, 3, 4, 5, 10, 20, 30, 100, 200, 0, 0, 0, 0, 0]

(d..c).asSequence(44100.0f).take(15).toList()
// won't compile as the first operand `d` is infinite stream 

If you want to do a finite stream from the infinite one, you may use trim operation:

val sine1 = 440.sine().trim(3)
val sine2 = listOf(0.1, 0.2, 0.3).map { sampleOf(it) }.input()

(sine1..sine2).asSequence(1000.0f).toList()
// results in stream [1.0, -0.9297764858882515, 0.7289686274214119, 0.1, 0.2, 0.3]