File: BasicOpsStream.sc

package info (click to toggle)
supercollider 1%3A3.4.5-1wheezy1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 26,972 kB
  • sloc: cpp: 116,645; lisp: 64,914; ansic: 10,725; python: 3,548; perl: 766; ruby: 487; sh: 152; makefile: 117; xml: 13
file content (105 lines) | stat: -rw-r--r-- 2,236 bytes parent folder | download
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

// These Streams are instantiated by math operations on other Streams

UnaryOpStream : Stream {
	var >operator, >a;

	*new { arg operator, a;
		^super.newCopyArgs(operator, a)
	}
	next { arg inval;
		var vala;
		vala = a.next(inval);
		if (vala.isNil, { ^nil },{ ^vala.perform(operator); });
	}
	reset { a.reset }
	storeOn { arg stream; stream <<< a << "." << operator }

}

BinaryOpStream : Stream {
	var >operator, >a, >b;

	*new { arg operator, a, b;
		^super.newCopyArgs(operator, a, b)
	}
	next { arg inval;
		var vala, valb;
		vala = a.next(inval);
		if (vala.isNil, { ^nil });
		valb = b.next(inval);
		if (valb.isNil, { ^nil });
		^vala.perform(operator, valb);
	}
	reset { a.reset; b.reset }

	storeOn { arg stream;
			stream << "(" <<< a << " " << operator.asBinOpString << " " <<< b << ")"
	}
}


BinaryOpXStream : Stream {
	var operator, a, b, vala;

	*new { arg operator, a, b;
		^super.newCopyArgs(operator, a, b)
	}
	next { arg inval;
		var valb;
		if (vala.isNil) {
			vala = a.next(inval);
			if (vala.isNil) { ^nil };
			valb = b.next(inval);
			if (valb.isNil, { ^nil });
		}{
			valb = b.next(inval);
			if (valb.isNil) {
				vala = a.next(inval);
				if (vala.isNil) { ^nil };
				b.reset;
				valb = b.next(inval);
				if (valb.isNil) { ^nil };
			};
		};
		^vala.perform(operator, valb);
	}
	reset { vala = nil; a.reset; b.reset }
	storeOn { arg stream;
			stream << "(" <<< a << " " << operator.asBinOpString;
			stream << ".x";
			stream << " " <<< b << ")"
	}
}



NAryOpStream : Stream {
	var >operator, >a, arglist;
	var isNumeric;

	*new { arg operator, a, arglist;
		^super.newCopyArgs(operator, a).arglist_(arglist)
	}
	arglist_ { arg list;
		// optimization
		isNumeric = list.every({ arg item; item.isNumber or: {item.class === Symbol} }); 		arglist = list;
	}
	next { arg inval;
		var vala, values;
		vala = a.next(inval);
		if (vala.isNil, { ^nil });
		values = if (isNumeric) { arglist } {
				arglist.collect({ arg item; var res;
					res = item.next(inval);
					if(res.isNil) { ^nil };
					res
				})
				};
		^vala.performList(operator, values);
	}
	reset { a.reset; arglist.do({ arg item; item.reset }) }

	storeOn { arg stream; stream <<< a << "." << operator << "(" <<<* arglist << ")" }
}