--- /dev/null
+# Stubs for itertools\r
+\r
+# Based on http://docs.python.org/3.2/library/itertools.html\r
+\r
+from typing import (Iterator, TypeVar, Iterable, overload, Any, Callable, Tuple,\r
+ Generic, Optional)\r
+\r
+_T = TypeVar('_T')\r
+_S = TypeVar('_S')\r
+_N = TypeVar('_N', int, float)\r
+\r
+def count(start: _N = ...,\r
+ step: _N = ...) -> Iterator[_N]: ... # more general types?\r
+def cycle(iterable: Iterable[_T]) -> Iterator[_T]: ...\r
+\r
+@overload\r
+def repeat(object: _T) -> Iterator[_T]: ...\r
+@overload\r
+def repeat(object: _T, times: int) -> Iterator[_T]: ...\r
+\r
+def accumulate(iterable: Iterable[_T], func: Callable[[_T, _T], _T] = ...) -> Iterator[_T]: ...\r
+\r
+class chain(Iterator[_T], Generic[_T]):\r
+ def __init__(self, *iterables: Iterable[_T]) -> None: ...\r
+ def __next__(self) -> _T: ...\r
+ def __iter__(self) -> Iterator[_T]: ...\r
+ @staticmethod\r
+ def from_iterable(iterable: Iterable[Iterable[_S]]) -> Iterator[_S]: ...\r
+\r
+def compress(data: Iterable[_T], selectors: Iterable[Any]) -> Iterator[_T]: ...\r
+def dropwhile(predicate: Callable[[_T], Any],\r
+ iterable: Iterable[_T]) -> Iterator[_T]: ...\r
+def filterfalse(predicate: Optional[Callable[[_T], Any]],\r
+ iterable: Iterable[_T]) -> Iterator[_T]: ...\r
+\r
+@overload\r
+def groupby(iterable: Iterable[_T]) -> Iterator[Tuple[_T, Iterator[_T]]]: ...\r
+@overload\r
+def groupby(iterable: Iterable[_T],\r
+ key: Callable[[_T], _S]) -> Iterator[Tuple[_S, Iterator[_T]]]: ...\r
+\r
+@overload\r
+def islice(iterable: Iterable[_T], stop: Optional[int]) -> Iterator[_T]: ...\r
+@overload\r
+def islice(iterable: Iterable[_T], start: Optional[int], stop: Optional[int],\r
+ step: Optional[int] = ...) -> Iterator[_T]: ...\r
+\r
+def starmap(func: Callable[..., _S], iterable: Iterable[Iterable[Any]]) -> Iterator[_S]: ...\r
+def takewhile(predicate: Callable[[_T], Any],\r
+ iterable: Iterable[_T]) -> Iterator[_T]: ...\r
+def tee(iterable: Iterable[_T], n: int = ...) -> Tuple[Iterator[_T], ...]: ...\r
+def zip_longest(*p: Iterable[Any],\r
+ fillvalue: Any = ...) -> Iterator[Any]: ...\r
+\r
+_T1 = TypeVar('_T1')\r
+_T2 = TypeVar('_T2')\r
+_T3 = TypeVar('_T3')\r
+_T4 = TypeVar('_T4')\r
+_T5 = TypeVar('_T5')\r
+_T6 = TypeVar('_T6')\r
+\r
+@overload\r
+def product(iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ...\r
+@overload\r
+def product(iter1: Iterable[_T1],\r
+ iter2: Iterable[_T2]) -> Iterator[Tuple[_T1, _T2]]: ...\r
+@overload\r
+def product(iter1: Iterable[_T1],\r
+ iter2: Iterable[_T2],\r
+ iter3: Iterable[_T3]) -> Iterator[Tuple[_T1, _T2, _T3]]: ...\r
+@overload\r
+def product(iter1: Iterable[_T1],\r
+ iter2: Iterable[_T2],\r
+ iter3: Iterable[_T3],\r
+ iter4: Iterable[_T4]) -> Iterator[Tuple[_T1, _T2, _T3, _T4]]: ...\r
+@overload\r
+def product(iter1: Iterable[_T1],\r
+ iter2: Iterable[_T2],\r
+ iter3: Iterable[_T3],\r
+ iter4: Iterable[_T4],\r
+ iter5: Iterable[_T5]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5]]: ...\r
+@overload\r
+def product(iter1: Iterable[_T1],\r
+ iter2: Iterable[_T2],\r
+ iter3: Iterable[_T3],\r
+ iter4: Iterable[_T4],\r
+ iter5: Iterable[_T5],\r
+ iter6: Iterable[_T6]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ...\r
+@overload\r
+def product(iter1: Iterable[Any],\r
+ iter2: Iterable[Any],\r
+ iter3: Iterable[Any],\r
+ iter4: Iterable[Any],\r
+ iter5: Iterable[Any],\r
+ iter6: Iterable[Any],\r
+ iter7: Iterable[Any],\r
+ *iterables: Iterable[Any]) -> Iterator[Tuple[Any, ...]]: ...\r
+@overload\r
+def product(*iterables: Iterable[Any], repeat: int) -> Iterator[Tuple[Any, ...]]: ...\r
+\r
+def permutations(iterable: Iterable[_T],\r
+ r: Optional[int] = ...) -> Iterator[Tuple[_T, ...]]: ...\r
+def combinations(iterable: Iterable[_T],\r
+ r: int) -> Iterable[Tuple[_T, ...]]: ...\r
+def combinations_with_replacement(iterable: Iterable[_T],\r
+ r: int) -> Iterable[Tuple[_T, ...]]: ...\r