FunctionList multiple function


superclass: AbstractFunction



A FunctionList is a function that composes multiple functions into one. This allows allow to deal transparently with several functions as if they were one and to append new functions at a later point.


See the [Functions] help file for a basic introduction.


*new(functions) 

create a new instance. functions is an array of functions or objects


addFunc(function, function ..) 

This message is used to be able to add to an Object, to a Function, or to a FunctionList.

nil.addFunc returns a function, if only one function is passed in the argument.

function.addFunc then returns a FunctionList. 


removeFunc(function), remove a function from the list. 

Object  returns nil when appropriate.






// example


a = nil;

a = a.addFunc { |x="", y=""| "this % is an % example\n".postf(x, y); 1 };

a.postln;

a = a.addFunc { |x="", y=""| "there is no % that is %\n".postf(x, y); 2 };

a.value;

a.value("text", "extraordinary well written")

a.valueArray(["x", "y"]);



(

().use {

~x = "array";

~y = "ominous";

a.valueEnvir;

a.valueEnvir("list");

}

)



// removing a function

x = { "removal test".postln };

a.addFunc(x);

a.value;

a = a.removeFunc(x);

a.value;


// mathematics

a = x.addFunc({ 1.0.rand }).addFunc({ [0, 1].choose });

a = a.squared.linexp(0, 1, 1.0, 500);


a.value;



// compatibility with function multichannel expansion

a = nil;

a = a.addFunc { |x=0| if(x > 0) { 7 } { 1000.rand } };

a = a.addFunc { |x=0| if(x < 0) { 17 } { -1000.rand } };

a.value


a = a.flop;

a.value

a.value([-1, 1])




// typical usage (similar in action functions for views)


d = Document.current;

d.keyDownAction = { "You touched the keyboard.".postln };


d.keyDownAction = d.keyDownAction.addFunc {:x, x<-(1..), :: "already % times\n\n".postf(x) };

d.keyDownAction = nil;


// even if you don't know if there is already an action defined

// one can add one.


(

d.keyDownAction = nil;

d.keyDownAction = d.keyDownAction.addFunc {:x, x<-(1..), :: "already % times\n\n".postf(x) };


);


d.keyDownAction = nil;