Skip to content

Commit 56bb668

Browse files
committed
Basic implementation of itertools.tee
1 parent 8df849f commit 56bb668

File tree

2 files changed

+34
-21
lines changed

2 files changed

+34
-21
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2018, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -25,37 +25,19 @@
2525
*/
2626
package com.oracle.graal.python.builtins.modules;
2727

28-
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
29-
28+
import java.util.Collections;
3029
import java.util.List;
3130

32-
import com.oracle.graal.python.builtins.Builtin;
3331
import com.oracle.graal.python.builtins.CoreFunctions;
3432
import com.oracle.graal.python.builtins.PythonBuiltins;
35-
import com.oracle.graal.python.builtins.objects.PNone;
3633
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
37-
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
38-
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
3934
import com.oracle.truffle.api.dsl.NodeFactory;
40-
import com.oracle.truffle.api.dsl.Specialization;
4135

4236
@CoreFunctions(defineModule = "itertools")
4337
public final class ItertoolsModuleBuiltins extends PythonBuiltins {
4438

4539
@Override
4640
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
47-
return ItertoolsModuleBuiltinsFactory.getFactories();
48-
}
49-
50-
// tee(iterable, n=2)
51-
@Builtin(name = "tee", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
52-
@GenerateNodeFactory
53-
public abstract static class TeeNode extends PythonBuiltinNode {
54-
@SuppressWarnings("unused")
55-
@Specialization(guards = "isNoValue(n)")
56-
Object tee(Object iterable, PNone n) {
57-
throw raise(NotImplementedError, "tee");
58-
}
41+
return Collections.emptyList();
5942
}
60-
6143
}

graalpython/lib-graalpython/itertools.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,3 +858,34 @@ def __next__(self):
858858
@__graalpython__.builtin_method
859859
def __reduce__(self):
860860
return (type(self), (self.data, self.selectors))
861+
862+
863+
def tee(iterable, n=2):
864+
import collections
865+
class _tee:
866+
@__graalpython__.builtin_method
867+
def __init__(self, it, deque, deques):
868+
self.it = it
869+
self.deque = deque
870+
self.deques = deques
871+
872+
@__graalpython__.builtin_method
873+
def __iter__(self):
874+
return self
875+
876+
@__graalpython__.builtin_method
877+
def __next__(self):
878+
if not self.deque:
879+
newval = next(self.it)
880+
for d in self.deques:
881+
d.append(newval)
882+
return self.deque.popleft()
883+
884+
if not isinstance(n, int):
885+
raise TypeError()
886+
if n < 0:
887+
raise ValueError("n must be >=0")
888+
889+
deques = [collections.deque() for i in range(n)]
890+
it = iter(iterable)
891+
return tuple(_tee(it, d, deques) for d in deques)

0 commit comments

Comments
 (0)