2014-12-02 3 views
0

나는 한 번에 25 개의 덩어리로 물건의 목록을 반환하는 서버 API를 가지고있다. 모든 응답을 통해 항목 목록과 다음 서버 호출에 사용할 수있는 "토큰"을 가져와 다음 25 개를 반환합니다.반복에 따라 썽크를 순차로 변환

우리는 stodgy old mutable Java로 작성된 클라이언트 라이브러리를 사용하고 있으며 Scala의 모든 기능 구성 패턴에 잘 적응하지 못하고 있음에 유의하십시오.

로컬 항목 목록이 모두 소모 될 때마다 최신 토큰으로 서버 호출을 수행하여 모든 서버 항목의 지연 평가 된 시퀀스를 반환하는 방법을 찾고 있습니다. 지금까지 내가 가진 것 :

def fetchFromServer(uglyStateObject: StateObject): Seq[Thing] = { 
    val results = server.call(uglyStateObject) 

    uglyStateObject.update(results.token()) 

    results.asScala.toList ++ (if results.moreAvailable() then 
     fetchFromServer(uglyStateObject) 
    else 
     List()) 
} 

그러나이 기능은 열심히 평가합니다. 내가 찾고있는 + + "엄격한 시퀀스"와 "지연 시퀀스", 썽크가 서버에서 다음 항목 집합을 검색하는 데 사용됩니다 연결하는 것입니다. 실제로, 나는 이런 식으로 뭔가를 원하는 : 나는 Seq.lazy 대신 사용할 모르는 제외

results.asScala.toList ++ Seq.lazy(() => fetchFromServer(uglyStateObject)) 

. 내가 지금까지 본 적이

것들 :이 때문에 사용되어서는 안된다는

  • SeqView하지만 내가 본 의견 모든 시간을 재평가?
  • 스트림이지만, 한 번에 여러 요소를 생성하려는 반면, 추상화는 한 번에 요소를 생성해야하는 것처럼 보입니다.

무엇을 사용해야합니까?

+0

나는 스칼라 스트림'프로세스'를 사용하는 것이 좋습니다. 이것은 단일 요소 뷰를 표면적으로 지향하고 있지만 한 번에 청크를 방출하는 데 사용할 수있는 매우 간단한 API가 있습니다. – lmm

답변

0

또한 scalaz-strem을 살펴 보시기 바랍니다.

def fetchFromServer(uglyStateObject: StateObject): Stream[Thing] = { 
    val results = server.call(uglyStateObject) 

    uglyStateObject.update(results.token()) 

    results.asScala.toStream #::: (if results.moreAvailable() then 
     fetchFromServer(uglyStateObject) 
    else 
     Stream.empty) 
} 

: 여기에 작은 예는이 사실

import scalaz.stream._ 
    import scalaz.concurrent.Task 

    // Returns updated state + fetched data 
    def fetchFromServer(uglyStateObject: StateObject): (StateObject, Seq[Thing]) = ??? 

    // Initial state 
    val init: StateObject = new StateObject 

    val p: Process[Task, Thing] = Process.repeatEval[Task, Seq[Thing]] { 
    var state = init 
    Task(fetchFromServer(state)) map { 
     case (s, seq) => 
     state = s 
     seq 
    } 
    } flatMap Process.emitAll 
0

처럼 보일 수 있습니다 어떻게는 그동안 난 이미 내가 (실제로 스트림을 사용하여) 더 읽기 쉽게 찾을 수 있습니다 약간 다른 대답을 발견 모두를위한 고마워요

관련 문제