diff --git a/source/com/kemsky/Stream.as b/source/com/kemsky/Stream.as index 4e7f66f..115d130 100644 --- a/source/com/kemsky/Stream.as +++ b/source/com/kemsky/Stream.as @@ -1960,10 +1960,39 @@ package com.kemsky */ public function forEach(callback:Function):Stream { - source.forEach(function (item:*, index:int, array:Array):void + var count:uint = callback.length; + var f:Function; + switch(count) { - callback(item); - }); + case 0: + f = function (item:*, index:int, array:Array):void + { + callback(); + }; + break; + case 1: + f = function (item:*, index:int, array:Array):void + { + callback(item); + }; + break; + case 2: + f = function (item:*, index:int, array:Array):void + { + callback(item, index); + }; + break; + case 3: + var that:Stream = this; + f = function (item:*, index:int, array:Array):void + { + callback(item, index, that); + }; + break; + default: + throw new StreamError("Unexpected arguments count: " + count); + } + source.forEach(f); return this; } @@ -1988,10 +2017,39 @@ package com.kemsky */ public function map(callback:Function):Stream { - return new Stream(source.map(function (item:*, index:int, array:Array):* + var count:uint = callback.length; + var f:Function; + switch(count) { - return callback(item); - })); + case 0: + f = function (item:*, index:int, array:Array):* + { + return callback(); + }; + break; + case 1: + f = function (item:*, index:int, array:Array):* + { + return callback(item); + }; + break; + case 2: + f = function (item:*, index:int, array:Array):* + { + return callback(item, index); + }; + break; + case 3: + var that:Stream = this; + f = function (item:*, index:int, array:Array):* + { + return callback(item, index, that); + }; + break; + default: + throw new StreamError("Unexpected arguments count: " + count); + } + return new Stream(source.map(f)); } /** diff --git a/testSrc/com/kemsky/TestArrayApi.as b/testSrc/com/kemsky/TestArrayApi.as index e7df8d6..de75551 100644 --- a/testSrc/com/kemsky/TestArrayApi.as +++ b/testSrc/com/kemsky/TestArrayApi.as @@ -34,8 +34,40 @@ package com.kemsky { counter++; }); + assertEquals(counter, 4); + + counter = 0; + s.forEach(function (item:Number, index:uint):void + { + counter++; + }); + assertEquals(counter, 4); + counter = 0; + s.forEach(function (item:Number, index:uint, stream:Stream):void + { + counter++; + }); assertEquals(counter, 4); + + counter = 0; + s.forEach(function ():void + { + counter++; + }); + assertEquals(counter, 4); + + try + { + s.forEach(function (item:Number, index:uint, stream:Stream, bla:int):void + { + counter++; + }); + assertFalse(true); + } + catch(e:Error) + { + } } [Test] diff --git a/testSrc/com/kemsky/TestStream.as b/testSrc/com/kemsky/TestStream.as index 5061b7f..7967fd6 100644 --- a/testSrc/com/kemsky/TestStream.as +++ b/testSrc/com/kemsky/TestStream.as @@ -426,7 +426,37 @@ package com.kemsky { var item:Item = new Item("name1", 5, 0); var s:Stream = $(item); - assertEquals(s.map(member("name")).first, "name1"); + assertEquals(s.map(function(item:Item):String + { + return item.name; + }).first, "name1"); + + assertEquals(s.map(function(item:Item, index:uint):String + { + return item.name; + }).first, "name1"); + + assertEquals(s.map(function(item:Item, index:uint, stream:Stream):String + { + return item.name; + }).first, "name1"); + + assertEquals(s.map(function():String + { + return "name1"; + }).first, "name1"); + + try + { + s.map(function(item:Item, index:uint, stream:Stream, bla:int):String + { + return item.name; + }); + assertFalse(true); + } + catch(e:Error) + { + } } [Test]