This will actually eagerly evaluate the iterator, which I don't think you want. See this:

```scala
scala> def fillSpool[K, V](it: Iterator[(K, V)], s: Promise[Spool[(K, V)]]): Unit = {
     |     if (it.isEmpty) {
     |       s() = Return(Spool.empty[(K, V)])
     |     } else {
     |       val next = new Promise[Spool[(K, V)]]
     |       s() = Return(it.next *:: next)
     |       fillSpool(it, next)
     |     }
     |   }
fillSpool: [K, V](it: Iterator[(K, V)], s: com.twitter.util.Promise[com.twitter.concurrent.Spool[(K, V)]])Unit

scala> val s = new Promise[Spool[(Int,Int)]]
s: com.twitter.util.Promise[com.twitter.concurrent.Spool[(Int, Int)]] = Promise@793497799(state=Waiting(null,List()))

scala> val it = Seq(1,2,3,4,5).iterator.map { i => println("hi!"); (i, i*2) }
it: Iterator[(Int, Int)] = non-empty iterator

scala> fillSpool(it, s)
hi!
hi!
hi!
hi!
hi!
```

I think you want to lazily evaluate the iterator.