Skip to content

Commit d1d29db

Browse files
committed
Add 'strict' argument to 'stutter' and add Generator copy method
1 parent a4f601b commit d1d29db

File tree

3 files changed

+33
-11
lines changed

3 files changed

+33
-11
lines changed

FoxDot/lib/.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.8.10
1+
0.8.11

FoxDot/lib/Patterns/Generators.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def func(self, index):
287287
self.last_value = f(self.last_value, self.step[index])
288288
return self.last_value
289289

290+
290291
class PDelta(GeneratorPattern):
291292
def __init__(self, deltas, start=0):
292293
GeneratorPattern.__init__(self)

FoxDot/lib/Patterns/Main.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,16 @@ def new(self, data):
120120
return self.__class__(data + self.meta)
121121

122122
def transform(self, func):
123-
return self.__class__([(item.transform(func) if isinstance(item, metaPattern) else func(item))for item in self])
123+
"""
124+
Recursively transforms values and nested patterns
125+
"""
126+
output = []
127+
for item in self.data:
128+
if isinstance(item, (metaPattern, GeneratorPattern)):
129+
output.append(item.transform(func))
130+
else:
131+
output.append(func(item))
132+
return self.__class__(output)
124133

125134
def int(self):
126135
return self.transform(int)
@@ -550,21 +559,27 @@ def mirror(self):
550559

551560
return self.new(new)
552561

553-
def stutter(self, n=2):
554-
""" Returns a new Pattern with each item repeated by `n`. Use
555-
a list of numbers for stutter different items by different
556-
amount. e.g.
557-
```
558-
>>> P[0, 1, 2, 3].stutter([1,3])
559-
P[0, 1, 1, 1, 2, 3, 3, 3]
560-
```
562+
def stutter(self, n=2, strict=False):
563+
"""
564+
Returns a new Pattern with each item repeated by `n`. Use
565+
a list of numbers for stutter different items by different
566+
amount. e.g.
567+
```
568+
>>> P[0, 1, 2, 3].stutter([1,3])
569+
P[0, 1, 1, 1, 2, 3, 3, 3]
570+
```
571+
Use strict=True to force generator patterns to return the
572+
same value `n` times in a row.
561573
"""
562574
n = asStream(n)
563575
lrg = max(len(self.data), len(n))
564576
new = []
565577
for i in range(lrg):
566578
for j in range(modi(n,i)):
567-
new.append(modi(self.data,i))
579+
item = modi(self.data,i)
580+
if strict and isinstance(item, GeneratorPattern):
581+
item = item.copy()
582+
new.append(item)
568583
return self.new(new)
569584

570585
def arp(self, arp_pattern):
@@ -1434,6 +1449,12 @@ def map(self, mapping, default=0):
14341449
"""
14351450
return self.transform( lambda value: mapping.get(value, default) )
14361451

1452+
def copy(self):
1453+
'''
1454+
Returns a new Pattern Generator with same inputs
1455+
'''
1456+
return self.__class__(*self.args, **self.kwargs)
1457+
14371458
# TODO - handle callables
14381459
# funcs = {}
14391460

0 commit comments

Comments
 (0)