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. 

returns the last function when only one function is left.

returns nil when the last function was removed.


addFunc and removeFunc are implemented for Nil, Object and FunctionList


nil.addFunc(f): returns f

obj.addFunc(f): returns FunctionList([obj, f])


nil.removeFunc(f) returns nil

obj.removeFunc(f) returns nil, if f === obj, else obj is returned




// 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 = nil;

a = a.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 in a Document action

// see also SCView: addAction example.


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;