2016-12-28 56 views
5

Załóżmy, że mam generator, który zwraca mi jakieś wyniki podzielone na kawałki, że chcę, aby pociągnąć do płaskiej listy:takeUntil? Przetwarzanie fragmentów wejściowych. W jaki sposób?

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 
} 

Koncepcyjnie jest to, co chcę, z wyjątkiem, że pobiera całą zawartość z góry i chcę, żeby to było leniwe. coś takiego:

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

prawie działa, ale odrzuca ostatni kawałek.

Wygląda na to, że potrzebuję tutaj .takeUntil: jak takeWhile, ale przed zakończeniem przejdź przez cały łańcuch. Jak zrobić to idiomatycznie?

+0

Powiązany? http://stackoverflow.com/questions/33602714/how-to-implement-takeuntil-of-a-list –

+1

@ evan058, które nie pomaga wiele, ponieważ '.span' materializuje całą sprawę z góry. : / – Dima

Odpowiedz

0

to co wymyśliłem ... Wygląda trochę ohydne ale to najlepsze co mogłem myśleć:

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

lepiej pomysłów?