listscalastreaminfinite

Scala, repeat a finite list infinitely


I want to use Stream class in scala to repeat a given list infinitely.

For example the list (1,2,3,4,5) I want to create a stream that gives me (1,2,3,4,5,1,2,3,4,5,1,2,3....)

So that I can wrap the take operation. I know this can be implemented in other ways, but I wanna do it this way for some reason, just humor me :)

So the idea is that with this infinite cycle created from some list, I can use take operation, and when it reaches the end of the list it cycles.

How do I make a stream which simply repeats a given list?


Solution

  • Very similar to @Eastsun's, but a bit more intention revealing. Tested in Scala 2.8.

    scala> val l  = List(1, 2, 3)
    l: List[Int] = List(1, 2, 3)
    
    scala> Stream.continually(l.toStream).flatten.take(10).toList
    res3: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3, 1)
    

    Alternatively, with Scalaz:

    scala> import scalaz._
    import scalaz._
    
    scala> import Scalaz._
    import Scalaz._
    
    scala> val l = List(1, 2, 3)
    l: List[Int] = List(1, 2, 3)
    
    scala> l.toStream.repeat[Stream].join.take(10).toList
    res7: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3, 1)