// What basic function exist to create a Stream
{
val s = Stream.from(-1)
println("(1)" + take10(s))
}
{
val s = Stream.from(100, -3)
println("(2)" + take10(s))
}
{
val s = Stream.continually("A")
println("(3)" + take10(s))
}
{
val s = "B" #:: Stream.continually("A")
println("(4)" + take10(s))
}
// Add a separator except for the first item using the [false, true, true, true, ...] stream s1
{
val s1 = false #:: Stream.continually(true)
val s2 = List("A", "B", "C")
val s3 = s2 zip s1
val l = (s3 map { case (v, b) => if (b) List("|", v) else List(v) }).flatten mkString ("(", "", ")")
println("(5a)" + l)
}
// The [false, true, true, true, ...] stream s1 can be reused in different threads at the same time. It is immutable
{
val s1 = false #:: Stream.continually(true)
scala.actors.Actor.actor {
val s2 = 1 to 5
val s3 = s2 zip s1
val l = (s3 map { case (v, b) => if (b) List("|", v) else List(v) }).flatten mkString ("(", "", ")")
println("(5b)" + l)
}
scala.actors.Actor.actor {
val s2 = List("A", "B", "C")
val s3 = s2 zip s1
val l = (s3 map { case (v, b) => if (b) List("|", v) else List(v) }).flatten mkString ("(", "", ")")
println("(5c)" + l)
}
scala.actors.Actor.actor {
val s2 = 1 to 200
val s3 = s2 zip s1
val l = (s3 map {case (v, true) => List("|", v) case (v, _) => List(v) }).flatten mkString ("(", "", ")")
println("(5d)" + l)
}
scala.actors.Actor.actor {
val s2 = 1 to 200
val s3 = s2 zip s1
val l = (s3 map {case (v, true) => List("|", v) case (v, _) => List(v)}).flatten mkString ("(", "", ")")
println("(5e)" + l)
}
}
{
// How can that be written in one line ?
val s1: Stream[Option[String]] = Stream.continually(Some("A"))
val s = None #:: s1
println("(6)" + take10(s))
}
// Iterate is for me the most interesting method of creating streams
{
val s = Stream.iterate(2) { n => n + 3 }
println("(7)" + take10(s))
}
{
val s = Stream.iterate(List.fill(4)(100)) { n => n map (_ + 1) }
println("(8)" + take10(s))
}
{
val s = Stream.iterate(List.fill(4)(-4)) { n => n map (_ + 1) }.flatten
println("(9)" + take10(s))
}
{
val s = Stream.continually(0 until 4)
println("(10)" + take10(s))
}
{
val s = Stream.continually(0 until 4).flatten
println("(11)" + take10(s))
}
// Coordinates for an n columns array produced with two streams s1, s2
{
val n = 3
val s1 = Stream.continually(0 until n).flatten
val s2 = Stream.iterate(List.fill(n)(0)) { n => n map (_ + 1) }.flatten
val s = s1 zip s2
println("(12a)" + take30(s1))
println("(12b)" + take30(s2))
println("(12c)" + take30(s))
println("(12d)" + s(10))
println("(12e)" + s(1000000))
// Much faster than the one before
println("(12f)" + s(999999))
}
def take10[A](s: Iterable[A]) = s.take(10).toList
def take30[A](s: Iterable[A]) = s.take(30).toList
}