FChain is a library that can be used as a base to construct slideshows, presentations , image galleries or just used to run a predetermined number of functions in order. At it's core it is simply an array-like object of functions, which can be traversed through or automatically executed based on a timer.
What I like is the API. Here is the code sample from GitHub.
var setColor = function(color) { return function() { document.body.style.backgroundColor = color; console.log(color); } } // setup a chain with 3 functions var fchain = FChain(setColor('red'), setColor('green'), setColor('blue')); fchain.next(); //logs: 'red' fchain.next().next(); //logs: 'green', 'blue'The ability to pass a list of functions as parameter to be called at a later date is an interesting concept to build API. In the sample it is not yes Function Composition as we do not feed the returned value of one function as a parameter of another. I guess it some kind of chaining.
The question is how do write such an API in C#? Since C# has generic delegate and closure, this should be possible.
Here is my version
static Action SetColor(string color) { return new Action ( () => { Console.WriteLine("Color:{0}", color); } ); } static void Main(string[] args) { var fChain = ChainClass.FChain(SetColor("Red"), SetColor("Green"), SetColor("Blue")); fChain.Next(); // Log Red fChain.Next().Next(); // Log Green, Blue }The C# complete source
class ChainClass { private List_functions; private int _index; public ChainClass(List functions) { this._functions = functions; this._index = 0; } public static ChainClass FChain(params Action [] functions) { return new ChainClass(functions.ToList()); } public ChainClass Next() { this._functions[this._index](); this._index++; return this; } public void Clear() { this._functions.Clear(); } public void SetNext(int index) { this._index = index; } } static Action SetColor(string color) { return new Action ( () => { Console.WriteLine("Color:{0}", color); } ); } static void Main(string[] args) { var fChain = ChainClass.FChain(SetColor("Red"), SetColor("Green"), SetColor("Blue")); fChain.Next(); // Log Red fChain.Next().Next(); // Log Green, Blue }
No comments:
Post a Comment