Retronym ответ хорошо работает, если вы используете 2.8. Если вы используете 2.7.x, не существует отличного решения, но вы можете легко создать свое собственное. Например, если вы хотите только тройки, где до и после существуют, вы можете сделать что-то вроде этого:
class Tuple3Iterator[T](solo: Iterator[T]) extends Iterator[(T,T,T)] {
var current = if (solo.hasNext) Some(solo.next) else None
var future = if (solo.hasNext) Some(solo.next) else None
def hasNext = solo.hasNext
def next = {
val past = current
current = future
future = Some(solo.next)
(past.get,current.get,future.get)
}
}
class IteratorToT3[T](it: Iterator[T]) {
def treble = new Tuple3Iterator[T](it)
}
implicit def allowTrebling[T](it: Iterable[T]) = new IteratorToT3[T](it.elements)
scala> List("Hi","there",5,"you").treble.foreach(println(_))
(Hi,there,5)
(there,5,you)
Если вы предпочитаете оставить опции до и после того, как останетесь, (изменить: я действительно не давал полный или безошибочный набор изменений до этого), вместо этого используйте
class Tuple3Iterator[T](solo: Iterator[T]) extends Iterator[(Option[T],T,Option[T])] {
var current = None:Option[T]
var future = if (solo.hasNext) Some(solo.next) else None
def hasNext = (solo.hasNext || future!=None)
def next = {
val past = current
current = future
future = if (solo.hasNext) Some(solo.next) else None
(past,current.get,future)
}
}
scala> List("Hi","there",5,"you").treble.foreach(println(_))
(None,Hi,Some(there))
(Some(Hi),there,Some(5))
(Some(there),5,Some(you))
(Some(5),you,None)