2016-12-28 45 views
5

Ben düz bir liste içine çekmek istediğiniz, bana parçalarına kırılabilir bazı sonuçları döndürür bir jeneratör, olduğunu varsayalım: Kavramsal olaraktakeUntil? Parçalanmış giriş işleme. Nasıl?

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 
} 

, bu, tüm içerik olarak alınır dışında ben istediğim şey önündeyim ve tembel olmasını istiyorum. Böyle şey:

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

neredeyse çalışır, ancak son yığın atar.

.takeUntil'a ihtiyacım var gibi görünüyor: takeWhile gibi, ancak sonlandırmadan önce tüm zinciri gözden geçirin. Bunu nasıl deyimsel olarak yapıyorum?

+0

İlgili? http://stackoverflow.com/questions/33602714/how-to-implement-takeuntil-of-a-list –

+1

@ evan058 çok fazla yardımcı olmadığından, '.span' her şeyi ön plana çıkarır. : / – Dima

cevap

0

Bu ben ile ne geldi edilir ... tür yucky görünüyor ama bu düşünebildiğim en iyisi:

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

Herhangi daha iyi fikirler?