Reading lines from a file in random order
Regarding your questions:


You're reading bytes.  Fortunately, the only three line ending
conventions all involve Newline and Return, both a single byte.
There's nothing more to it.  So if you stay with an encoding using
single bytes for (most of) their characters, such as UTF-8, there will
be no problem.  For other Unicode encodings you'd have to read more
than one byte per character and also do some decoding.

Frankly even without encodings this is a hairy topic,
c.f. Newline on Wikipedia.
Though line-offsets uses the same convention as readLine, so I
guess that's just FYI.
I'd at least not use short/one-letter variable names for function
parameters, because they also serve as documentation.  E.g. r
doesn't tell the reader anything, rdr is barely english, but
reader is clear and doesn't cost that much more in terms of
characters.  Same with s and sequence.  For a, b, c in
line-offsets I'd even say that c1 to c3 would be more helpful.
It'd be best to orient yourself at standard functions.  It's probably
better to have the most important "subject" first, then subsequently
the rest unless there's a good reason not to.  Parameters at the ends
can also very easily be curried, maybe that's another hint to think
about it.


Other than that, yeah, looks good.  I don't quite see why the laziness
is necessary, since it's calling shuffle anyway, but perhaps it's
useful in some situations?