File: BasicOpsStream.sc

package info (click to toggle)
supercollider 1%3A3.10.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 45,496 kB
  • sloc: cpp: 283,513; lisp: 74,040; ansic: 72,252; sh: 23,016; python: 7,175; makefile: 1,087; perl: 766; java: 677; yacc: 314; lex: 175; ruby: 136; objc: 65; xml: 15
file content (103 lines) | stat: -rw-r--r-- 2,234 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
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
// 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 << ")" }
}