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?
Very similar to @Eastsun's, but a bit more intention revealing. Tested in Scala 2.8.
Alternatively, with Scalaz:
There is a simple way with Stream#flatten in scala 2.8
An alternative method is concatenating the
.toStream
of the input with itself recursively. That is,Stolen blatently from the excellent Scala by Example book, chapter 12, and with a few modifications:
This works for all Seq types (unless they can't be read from multiple times, of course). Might not be efficient if the .length call is slow. Tested in Scala 2.7.7.
Here's an implementation which doesn't assume that
length
is efficient:This should run in constant time for any
Seq
(includingList
or evenStream
) and only imposes a constant time overhead to populate each element. Also, it works even for infinite sequences. So, you can callrep
on an infiniteStream
and the resultingStream
will be equivalent to the input.