Замена для Array - Stream
В последнее время часто приходилось писать на as3, причем немало кода связано с перебором коллекций, проверкой условий на коллекции. Существующие варианты Array, ArrayCollection,Vector,ArrayList конечно дело свое делают, но некоторые вещи писать не очень приятно и не универсально (для каждого класса нужен конвертер или хелпер):
var a:Array = [1, 2, 3]; var b:Array = a.filter(function(item:Number, index:uint, array:Array):Boolean { return item > 2; });
Первой попыткой было расширение массива, но этот путь тупиковый так как нельзя изменить сигнатуры методов, поэтому решил написать свою, спасибо есть Proxy класс.
Можно перейти и сразу посмотреть полное
описание здесь. Библиотека собирается maven, автоматически тестируется на travis ci, cobertura показывает 100% покрытие тестами.
Несоколько примеров:
//create empty Stream //$ - is provided global function var s:Stream = $(); var s:Stream = new Stream(); //create Stream from arguments, array or ArrayCollection var s:Stream = $(1, 2 , 3); var s:Stream = $([1, 2, 3]); var s:Stream = $(new ArrayCollection([1, 2, 3])); trace(s.join(",")); //prints 1,2,3 //first, second third etc. trace(s.first); //prints 1 //access by negative index (like Ruby arrays) trace(s[3], s[-1]); //prints 3,3 trace(s.unique); //prints true trace(s.empty) //prints false trace(s.contains(1)) //prints true var sum2:Number = $(0, 1, 2, 3, 4).foldRight(function (prev:Number, current:Number):Number { return prev + current; }, 10); trace(sum2); //prints 20 public class Item { public var name:String; public var price:Number; } var item1:Item = new Item("1", 1); var item2:Item = new Item("2", 2); var s:Stream = $(item1, item2); // 1. using custom callback var result:Stream = s.filter(function(item:Item):Boolean{ return item.price > 1; }); // 2. using provided global functions var result:Stream = s.filter(gt(prop("price"), 1)); // 3. using Proxy magick and global functions var result:Stream = s.price(gt(_, 1)); //all three provide identical results //prints 1, 2, 3 var item1:Item = new Item("car", 1); var item2:Item = new Item("truck", 2); var s:Stream = $(item1, item2); var prices:Stream = s..price; trace(prices); //prints 1,2
Всего комментариев 7
Комментарии
06.10.2015 14:43 | |
Почему именно оберткой, а не утилитой?
|
06.10.2015 15:25 | |
06.10.2015 15:45 | |
Я этого стремления к с трудом читаемому минимализму не очень понимаю.
|
09.10.2015 18:26 | |
js не стоит на месте https://developer.mozilla.org/en-US/..._Objects/Array
добавили в es6 итераторы, под них новые циклы, стрелочки чтобы не писать function(),надо будет посмотреть. Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior [0, 0, 0].fill(7, 1) // [0,7,7] [1, 2, 3].find(x => x == 3) // 3 [1, 2, 3].findIndex(x => x == 2) // 1 [1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2] ["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"] ["a", "b", "c"].keys() // iterator 0, 1, 2 ["a", "b", "c"].values() // iterator "a", "b", "c" |
12.10.2015 17:04 | |
Глобальные функции. Анонимные функции. Паровозы из нечеловекочитаемых методов.
Кошмар какой-то. |
Последние записи от kemsky
- Замена для Array - Stream (05.10.2015)