Więc Play2.0 Enumeratee page pokazuje przykład stosując metodę, &>
lub through
Aby zmienić Enumerator[String]
w produkt Enumerator[Int]
:Jak napisać enumeratee do kawałka moduł wyliczający wzdłuż różnych granic
val toInt: Enumeratee[String,Int] = Enumeratee.map[String]{ s => s.toInt }
val ints: Enumerator[Int] = strings &> toInt
Istnieje również Enumeratee.grouped
enumeratee, aby utworzyć moduł wyliczający porcje z poszczególnych elementów. Wydawało się, że działa dobrze.
Ale widzę, że zwykły wkład będzie w postaci Array[Byte]
(który jest zwracany przez Enumerator.fromFile
i Enumerator.fromStream
). Mając to na uwadze chciałbym wziąć te wejścia Array[Byte]
i przekształcić je w Enumerator[String]
, na przykład, gdzie każdy ciąg jest linią (zakończoną przez '\n'
). Granice dla linii i elementów Array[Byte]
zwykle nie pasują. Jak napisać moduł wyliczający, który może przekonwertować porwane tablice na fragmenty łańcuchów?
Celem jest przeniesienie tych linii z powrotem do przeglądarki, ponieważ stają się one dostępne dla każdego Array[Byte]
i pozostawienie pozostałych bajtów, które nie były częścią kompletnej linii, dopóki nie pojawi się kolejny fragment wejściowy.
Idealnie chciałabym mieć metodę, która punktację iter: Iteratee[Array[Byte], T]
i Enumerator[Array[Byte]]
dadzą mi się Enumerator[T]
, gdzie moi elementy T zostały przeanalizowane przez iter
.
Dodatkowe informacje: Miałem trochę czasu, aby posprzątać mój kod i tutaj jest konkretny przykład tego, co próbuję zrobić. Mam następujące iteratees które wykrywają następny wiersz:
import play.api.libs.iteratee._
type AB = Array[Byte]
def takeWhile(pred: Byte => Boolean): Iteratee[AB, AB] = {
def step(e: Input[AB], acc: AB): Iteratee[AB, AB] = e match {
case Input.EOF => Done(acc, Input.EOF)
case Input.Empty => Cont(step(_, acc))
case Input.El(arr) =>
val (taking, rest) = arr.span(pred)
if (rest.length > 0) Done(acC++ taking, Input.El(rest))
else Cont(step(_, acC++ taking))
}
Cont(step(_, Array()))
}
val line = for {
bytes <- takeWhile(b => !(b == '\n' || b == '\r'))
_ <- takeWhile(b => b == '\n' || b == '\r')
} yield bytes
i co chciałbym zrobić to coś takiego:
Ok.stream(Enumerator.fromFile(filename) &> chunkBy(line)).as("text/plain")
Chłodzenia. Czułem, że "grupa" powinna zrobić to, co chciałem. – huynhjl