File: Prewrite.sc

package info (click to toggle)
supercollider 1%3A3.6.6~repack-2-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 23,792 kB
  • ctags: 25,269
  • sloc: cpp: 177,129; lisp: 63,421; ansic: 11,297; python: 1,787; perl: 766; yacc: 311; sh: 286; lex: 181; ruby: 173; makefile: 168; xml: 13
file content (64 lines) | stat: -rw-r--r-- 1,632 bytes parent folder | download | duplicates (7)
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
	}
}