Я пытаюсь придерживаться стиля чистого FP и хочу создать ссылочную прозрачную функцию.
У меня есть java.nio.channels.SeekableByteChannel
, который является источником данных.И как только я открываю файл и получаю экземпляр SeekableFileChannel
, мне нужно прочитать первые строки файла и использовать эти строки для определения позиции поиска.
Итак, я создал следующую функцию:
object AdjustChannelAndGetStream {
def apply(ch: SeekableFileChannel)
(firstChunksToOffset: List[Array[Byte]] => Long): fs2.Stream[Id, Array[Byte]] {
val offset = //depending on the first bytes read from the file
//get the number of bytes read before
val newChannel = ch.position(offset)
//finally wrap newChannel into fs2.Stream
}
}
Дело в том, что функция выглядит некрасиво.Не приостанавливает побочные эффекты, что затрудняет тестирование (издевательство SeekableByteChannel
).
Я склонен обернуть SeekableByteChannel
в IO[SeekableByteChannel]
(Scalaz / Cats не имеет значения), но я не понимаю, как это может помочь (нам нужны такие же mock
из SeekableByteChannel
, нотеперь обернуто в IO
).
Можете ли вы помочь мне сконструировать эту функцию в стиле чистого FP (или, по крайней мере, сделать ее не такой уродливой)?