2016-12-28 2 views
5

Предположим, у меня есть генератор, который возвращает мне некоторые результаты распались на куски, что я хочу, чтобы тянуть в виде плоского списка:takeUntil? Обработка помеченного ввода. Как?

def pull(chunk: Chunk, result: Stream[Item] = Stream.empty): Stream[Item] = { 
    val soFar = chunk.items ++ result 
    if(chunk.hasNext) pull(generator.next(chunk), soFar) else soFar 
} 

Концептуально, это то, что я хочу, за исключением того, она извлекает все содержимое заранее, и я хочу, чтобы он ленился. Что-то вроде этого:

Stream.iterate(generator.first)(generator.next) 
    .takeWhile(_.hasNext) 
    .flatMap(_.items) 

почти работает, но он удаляет последний кусок.

Кажется, мне нужен .takeUntil здесь: как takeWhile, но пройти всю цепочку перед завершением. Как я могу сделать это идиоматично?

+0

Родственные? http://stackoverflow.com/questions/33602714/how-to-implement-takeuntil-of-a-list –

+1

@ evan058, что мало помогает, потому что '.span' материализует все это заранее. : / – Dima

ответ

0

Это то, что я придумал ... Выглядит вроде противный, но это лучшее, что я мог думать:

Stream.iterate(generator.first) { 
    case chunk if chunk.hasNext => generator.next 
    case _ => null 
}.takeWhile(_ != null) 
    .flatMap(_.items) 

Любые лучшие идеи?