@@ -58,15 +58,17 @@ def _process_keys(left, right):
58
58
59
59
Parameters
60
60
----------
61
- left, right : Cycler or None
61
+ left, right : iterable of dictionaries or None
62
62
The cyclers to be composed
63
63
Returns
64
64
-------
65
65
keys : set
66
66
The keys in the composition of the two cyclers
67
67
"""
68
- l_key = left .keys if left is not None else set ()
69
- r_key = right .keys if right is not None else set ()
68
+ l_peek = next (iter (left )) if left is not None else {}
69
+ r_peek = next (iter (right )) if right is not None else {}
70
+ l_key = set (l_peek .keys ())
71
+ r_key = set (r_peek .keys ())
70
72
if l_key & r_key :
71
73
raise ValueError ("Can not compose overlapping cycles" )
72
74
return l_key | r_key
@@ -112,27 +114,23 @@ def __init__(self, left, right=None, op=None):
112
114
113
115
Do not use this directly, use `cycler` function instead.
114
116
"""
115
- self ._keys = _process_keys (left , right )
116
117
if isinstance (left , Cycler ):
117
- self ._left = left ._shallow_copy ()
118
+ self ._left = Cycler (left ._left , left ._right , left ._op )
119
+ elif left is not None :
120
+ self ._left = list (left )
118
121
else :
119
- self ._left = copy . copy ( left )
122
+ self ._left = None
120
123
121
124
if isinstance (right , Cycler ):
122
- self ._right = right ._shallow_copy ()
125
+ self ._right = Cycler (right ._left , right ._right , right ._op )
126
+ elif right is not None :
127
+ self ._right = list (right )
123
128
else :
124
- self ._right = copy . copy ( right )
129
+ self ._right = None
125
130
131
+ self ._keys = _process_keys (self ._left , self ._right )
126
132
self ._op = op
127
133
128
- def _shallow_copy (self ):
129
- ret = Cycler (None )
130
- ret ._keys = self .keys
131
- ret ._left = copy .copy (self ._left )
132
- ret ._right = copy .copy (self ._right )
133
- ret ._op = copy .copy (self ._op )
134
- return ret
135
-
136
134
@property
137
135
def keys (self ):
138
136
"""
@@ -251,7 +249,7 @@ def __iadd__(self, other):
251
249
self ._keys = _process_keys (old_self , other )
252
250
self ._left = old_self
253
251
self ._op = zip
254
- self ._right = other ._shallow_copy ( )
252
+ self ._right = Cycler ( other ._left , other . _right , other . _op )
255
253
return self
256
254
257
255
def __imul__ (self , other ):
@@ -270,7 +268,7 @@ def __imul__(self, other):
270
268
self ._keys = _process_keys (old_self , other )
271
269
self ._left = old_self
272
270
self ._op = product
273
- self ._right = other ._shallow_copy ( )
271
+ self ._right = Cycler ( other ._left , other . _right , other . _op )
274
272
return self
275
273
276
274
def __eq__ (self , other ):
0 commit comments