1
이 코드가 있으며 Stream에 반복을 중지시키고 누적 된 결과를 얻도록하고 싶습니다. 기본적으로, 반복은 그것이 작동Stream을 중지하여 다음 요소를 평가하고 누적 된 결과를 기능적 방식으로 얻는 방법
sealed trait Ele
case class FailureEle() extends Ele
case class SuccessEle() extends Ele
type EitherResult = Either[IndexedSeq[Ele], Seq[FailureEle]]
def parse(process: Process[Task, Ele], errorLimit: Int): EitherResult = {
val errorAccumulator = new ListBuffer[FailureEle]
val taskProcess = process.map(t => {
t match {
case x: FailureEle => errorAccumulator += x
case _ =>
}
t
}).takeWhile(_ => !(errorAccumulator.size == errorLimit))
val voSeq = taskProcess.runLog.run
if (errorAccumulator.isEmpty) {
Left(voSeq)
} else {
Right(errorAccumulator)
}
}
val result = Seq(FailureEle(), SuccessEle(), FailureEle(), SuccessEle(), SuccessEle(), FailureEle(), SuccessEle())
val adaptor = new SeqAdaptor[Ele](result)
val process: Process[Task, Ele] = Process
.repeatEval(Task {adaptor.next()}).takeWhile(t => !t.shouldStop).map(_.get)
parse(process, 1).isRight //no SuccessEle will be iterated
parse(process, 2).isRight //only one SuccessEle will be iterated
parse(process, 3).isRight //the last one SuccessEle will not be iterated
errorLimit의 수에 따라,하지만 난 더 많은 기능으로 해석 방법을 리팩토링 할 몇 가지 문제가있다 :
ListBuffer은 필수적 방법
takeWhile 조건은 여전히 ListBuffer 결과
그래서 ListBuffer를 사용하여 명령 방식을 대신 할 꼬리 재귀 방식이 있는지 궁금합니다.