I do not know that this will work, but you can try this:
val feeder = csv( filename )
val sequential = feeder.circular
val random = feeder.random
If the feeder is an immutable object, and the call to circular and random return a new object with new behavior, which knowing Stéphane it probably is, then when you feed from one or from the other, it will behave as you would expect. Try it, and see what happens.
Assuming it works as expected, there will be a very small chance that the request from the random feeder will pull the same record as the one the sequential one returned. The more users in the feeder, the less often it will happen. If that condition is unacceptable, then add code to loop until you get a new record.