Skip to content

Commit 9cd5ebb

Browse files
committed
ENH: add persistent style
Function to generate a default dict with a cycler bound to it. This functionality is currently in the documentation as an example. Closes #27
1 parent 684fb15 commit 9cd5ebb

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

cycler.py

+27
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
from itertools import product, cycle
4848
from six.moves import zip, reduce
4949
from operator import mul, add
50+
from collections import defaultdict
5051
import copy
5152

5253
__version__ = '0.10.0'
@@ -558,3 +559,29 @@ def _cycler(label, itr):
558559
itr = (v[lab] for v in itr)
559560

560561
return Cycler._from_iter(label, itr)
562+
563+
564+
class OutOfStyles(StopIteration):
565+
pass
566+
567+
568+
def persistent_style(cyl, repeat=False):
569+
'''Create a defaultdict mapping keys -> styles
570+
571+
Parameters
572+
----------
573+
cyl : Cycler
574+
The c
575+
'''
576+
def next_style():
577+
try:
578+
next(cy_iter)
579+
except StopIteration:
580+
raise OutOfStyles()
581+
582+
if repeat:
583+
cy_iter = cyl()
584+
return defaultdict(lambda: next(cy_iter))
585+
else:
586+
cy_iter = iter(cyl)
587+
return defaultdict(next_style)

test_cycler.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import six
44
from six.moves import zip, range
5-
from cycler import cycler, Cycler, concat
5+
from cycler import cycler, Cycler, concat, persistent_style, OutOfStyles
66
import pytest
77
from itertools import product, cycle, chain
88
from operator import add, iadd, mul, imul
@@ -341,3 +341,24 @@ def test_contains():
341341

342342
assert 'a' in ab
343343
assert 'b' in ab
344+
345+
346+
@pytest.mark.parametrize('repeat', [True, False])
347+
def test_persistent(repeat):
348+
a = cycler('a', range(3)) + cycler('b', range(3))
349+
dd = persistent_style(a, repeat=repeat)
350+
one = dd['one']
351+
two = dd['two']
352+
three = dd['three']
353+
354+
assert one == dd['one']
355+
assert two == dd['two']
356+
assert three == dd['three']
357+
if not repeat:
358+
with pytest.raises(OutOfStyles):
359+
dd['four']
360+
else:
361+
assert one == dd['four']
362+
assert one == dd['four']
363+
assert two == dd['five']
364+
assert three == dd['six']

0 commit comments

Comments
 (0)