From 59a7be314a554053486a0a01cb3e928fb5ec9a1c Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 13 Nov 2015 16:53:11 +0300 Subject: [PATCH] deduplicate --- source/com/kemsky/Stream.as | 56 +++++++++++++++++++++++++++++--- testSrc/com/kemsky/TestStream.as | 14 ++++++++ 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/source/com/kemsky/Stream.as b/source/com/kemsky/Stream.as index e588f14..45ad98c 100644 --- a/source/com/kemsky/Stream.as +++ b/source/com/kemsky/Stream.as @@ -1203,16 +1203,22 @@ package com.kemsky * * @internal immutable */ - //todo nullable property - public function dictionary(property:String, weak:Boolean = false):Dictionary + public function dictionary(property:String = null, weak:Boolean = false):Dictionary { var dict:Dictionary = new Dictionary(weak); for each (var item:* in source) { - if(item.hasOwnProperty(property)) + if(property != null && property.length > 0) { - var value:* = item[property]; - dict[value] = item; + if(item.hasOwnProperty(property)) + { + var value:* = item[property]; + dict[value] = item; + } + } + else + { + dict[item] = item; } } return dict; @@ -1320,6 +1326,46 @@ package com.kemsky } } + /** + * Create new stream from original by removing duplicate items. + * @param callback is compare function function(a:*, b:*):int. + * @return new stream without duplicate values. + * @example + *
+         *     var s:Stream = $(1, 2, 3, 1);
+         *     trace(s.deduplicate());
+         *     //Stream{1, 2, 3}
+         * 
+ * @internal immutable + */ + public function deduplicate(callback:Function = null):Stream + { + var result:Stream; + if(callback == null) + { + var map:Dictionary = this.dictionary(); + result = Stream.from(map); + } + 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) + { + result.removeItem(j); + } + } + } + } + return result; + } + /* * Array part */ diff --git a/testSrc/com/kemsky/TestStream.as b/testSrc/com/kemsky/TestStream.as index 6665b2f..7d66750 100644 --- a/testSrc/com/kemsky/TestStream.as +++ b/testSrc/com/kemsky/TestStream.as @@ -22,6 +22,16 @@ package com.kemsky { } + + [Test] + public function testDeduplicate():void + { + var s:Stream = $(1, 2, 4, 3, 2, 1); + + var d1:Stream = s.deduplicate(); + //assertEquals(d1.length, 4); + } + [Test] public function testEntries():void { @@ -428,6 +438,10 @@ package com.kemsky var d:Dictionary = s.dictionary("name"); assertEquals(d["1"], item1); assertEquals(d["2"], item2); + + var v:Dictionary = $(item1, item2, item1).dictionary(); + assertEquals(v[item1], item1); + assertEquals(v[item2], item2); } [Test]