diff --git a/source/com/kemsky/Stream.as b/source/com/kemsky/Stream.as index 45ad98c..9390221 100644 --- a/source/com/kemsky/Stream.as +++ b/source/com/kemsky/Stream.as @@ -1328,7 +1328,7 @@ package com.kemsky /** * Create new stream from original by removing duplicate items. - * @param callback is compare function function(a:*, b:*):int. + * @param callback is compare function function(a:*, b:*):Boolean. * @return new stream without duplicate values. * @example *
@@ -1340,23 +1340,30 @@ package com.kemsky */ public function deduplicate(callback:Function = null):Stream { - var result:Stream; - if(callback == null) + var result:Stream = this.concat(); + var i:int; + var j:int; + + if(callback != null) { - var map:Dictionary = this.dictionary(); - result = Stream.from(map); + for(i = 0; i < length - 1; i++) + { + for(j = i + 1; j < length; j++) + { + if(callback(result.getItem(i), result.getItem(j))) + { + result.removeItem(j); + } + } + } } else { - //todo - result = this.concat(); - var i:int; - var j:int; for(i = 0; i < length - 1; i++) { for(j = i + 1; j < length; j++) { - if(callback(result.getItem(i), result.getItem(j)) == 0) + if(result.getItem(i) === result.getItem(j)) { result.removeItem(j); } diff --git a/source/com/kemsky/filters/mapped.as b/source/com/kemsky/filters/mapped.as index d77697b..74fa09c 100644 --- a/source/com/kemsky/filters/mapped.as +++ b/source/com/kemsky/filters/mapped.as @@ -7,7 +7,8 @@ package com.kemsky.filters return function (item:*):Boolean { var v:* = toValue(item, val1); - return v is String ? map.hasOwnProperty(v): !(map[v] == null || map[v] === undefined); + var value:Object = map[v]; + return !(value == null); }; } } diff --git a/testSrc/com/kemsky/TestStream.as b/testSrc/com/kemsky/TestStream.as index 7d66750..833c706 100644 --- a/testSrc/com/kemsky/TestStream.as +++ b/testSrc/com/kemsky/TestStream.as @@ -26,10 +26,22 @@ package com.kemsky [Test] public function testDeduplicate():void { - var s:Stream = $(1, 2, 4, 3, 2, 1); + var s:Stream = $(1, 2, 2, 3, 1); var d1:Stream = s.deduplicate(); - //assertEquals(d1.length, 4); + assertEquals(d1.length, 3); + assertEquals(d1.first, 1); + assertEquals(d1.second, 2); + assertEquals(d1.third, 3); + + var s1:Stream = $("test", "you", "now"); + var d2:Stream = s1.deduplicate(function(a:String, b:String):Boolean + { + return a.length == b.length; + }); + assertEquals(d2.length, 2); + assertEquals(d2.first, "test"); + assertEquals(d2.second, "you"); } [Test]