1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
  
     | 
    
      Prewrite : FilterPattern {
	var <>dict, <>levels;
	*new { arg pattern, dict, levels=1;
		^super.new(pattern).dict_(dict).levels_(levels)
	}
	storeArgs { ^[ pattern, dict, levels ] }
	rewriteList { arg list, inval, level;
		var newlist;
		if (level == 0, {
			// if at bottom level, then embed all items in the stream
			if (list.isSequenceableCollection, {
				// isKindOf is necessary because Integer.do would do the wrong thing..
				list.do({ arg item;
					inval = item.embedInStream(inval);
				});
			},{
				inval = list.embedInStream(inval);
			});
		},{
			if (list.isSequenceableCollection, {
				// isKindOf is necessary because Integer.do would do the wrong thing..
				list.do({ arg item;
					// lookup item in rewrite dictionary
					newlist = dict.at(item);
					// found an entry ?
					if (newlist.notNil, {
						// do another level of rewriting
						inval = this.rewriteList( newlist, inval, level - 1 );
					},{
						// has no dictionary entry, so embed in stream
						inval = item.embedInStream(inval);
					});
				});
			},{
				// lookup item in rewrite dictionary
				newlist = dict.at(list);
				// found an entry ?
				if (newlist.notNil, {
					// do another level of rewriting
					inval = this.rewriteList( newlist, inval, level - 1 );
				},{
					// has no dictionary entry, so embed in stream
					inval = list.embedInStream(inval);
				});
			});
		});
		^inval;
	}
	embedInStream {  arg inval;
		var outval;
		var stream;
		stream = pattern.asStream;
		while({
			outval = stream.next(inval);
			outval.notNil;
		},{
			inval = this.rewriteList(outval, inval, levels);
		});
		^inval
	}
}
 
     |