@@ -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