Skip to content

Commit

Permalink
prop function nesting
Browse files Browse the repository at this point in the history
  • Loading branch information
kemsky committed Oct 22, 2015
1 parent faa0825 commit 89f25aa
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 29 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ var result:Stream = s.filter(function(item:Item):Boolean{
});
// 2. using provided global functions(can compare Boolean, Number, Date, XML, String types)
var result:Stream = s.filter(gt(prop(_, "price"), 1));
// supports nested properties i.e. prop("prop.prop.prop")
var result:Stream = s.filter(gt(prop("price"), 1));
// 3. using Proxy magick and global functions
var result:Stream = s.price(gt(_, 1));
Expand Down
70 changes: 62 additions & 8 deletions src/com/kemsky/filters/prop.as
Original file line number Diff line number Diff line change
@@ -1,19 +1,73 @@
package com.kemsky.filters
{
import com.kemsky.support.toValue;

/**
* Creates function that extracts named property from value
* @param value item or function applied to item
* @param name name of the property
* @return function function that extracts named property from value
*/
public function prop(value:*, name:String):Function
public function prop(name:String):Function
{
return function (item:*):*
var path:Array = name.split(".");

var p1:String = path.length > 0 ? path[0]: undefined;
var p2:String = path.length > 1 ? path[1]: undefined;
var p3:String = path.length > 2 ? path[2]: undefined;
var p4:String = path.length > 3 ? path[3]: undefined;
var p5:String = path.length > 4 ? path[4]: undefined;

switch (path.length)
{
item = toValue(item, value);
return item.hasOwnProperty(name) ? item[name] : undefined;
};
case 1:
return function (item:*):*
{
return item.hasOwnProperty(p1) ? item[p1] : undefined;
};
case 2:
return function (item:*):*
{
var result:* = undefined;
try
{
result = item[p1][p2];
}
catch(e:Error){}
return result;
};
case 3:
return function (item:*):*
{
var result:* = undefined;
try
{
result = item[p1][p2][p3];
}
catch(e:Error){}
return result;
};
case 4:
return function (item:*):*
{
var result:* = undefined;
try
{
result = item[p1][p2][p3][p4];
}
catch(e:Error){}
return result;
};
case 5:
return function (item:*):*
{
var result:* = undefined;
try
{
result = item[p1][p2][p3][p4][p5];
}
catch(e:Error){}
return result;
};
}

throw new Error("Property is too deep: '" + name + "', maximum nesting is 5");
}
}
2 changes: 1 addition & 1 deletion src/com/kemsky/support/toValue.as
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ package com.kemsky.support
{
result = value(item);
}
else if(value !== undefined)
else
{
result = value;
}
Expand Down
1 change: 1 addition & 0 deletions testSrc/Item.as
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package
public var price:Number;
public var vat:Number;
public var bool:Boolean;
public var item:Item;

public function Item(name:String = null, price:Number = 0, vat:Number = 0)
{
Expand Down
32 changes: 28 additions & 4 deletions testSrc/com/kemsky/TestStream.as
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@ package com.kemsky

var s1:Stream = $(1, 2, 3);
var i1:StreamIterator = new ValueIterator(s1);
var count:int = 0;
var count1:int = 0;
for each (var item:* in i1)
{
// Print.items("for each: ", i1.current, item);
if (++count < 10)
if (++count1 < 10)
{
i1.push(count);
i1.push(count1);
}
}

Expand Down Expand Up @@ -167,7 +167,7 @@ package com.kemsky
{
var item:Item = new Item("name1", 5, 0);
var s:Stream = $(item);
assertEquals(s.map(prop(_, "name")).first, "name1");
assertEquals(s.map(prop("name")).first, "name1");
}

[Test]
Expand Down Expand Up @@ -463,6 +463,18 @@ package com.kemsky
});

assertEquals(sum3, 10);

try
{
$().foldLeft(function (prev:Number, current:Number):Number
{
return prev + current;
});
assertTrue(false);
}
catch(e:Error)
{
}
}

[Test]
Expand All @@ -488,6 +500,18 @@ package com.kemsky
});

assertEquals(sum3, 10);

try
{
$().foldRight(function (prev:Number, current:Number):Number
{
return prev + current;
});
assertTrue(false);
}
catch(e:Error)
{
}
}

[Test]
Expand Down
69 changes: 58 additions & 11 deletions testSrc/com/kemsky/filters/TestFilters.as
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package com.kemsky.filters

import org.flexunit.asserts.assertEquals;
import org.flexunit.asserts.assertFalse;
import org.flexunit.asserts.assertTrue;

public class TestFilters
{
Expand Down Expand Up @@ -64,8 +65,8 @@ package com.kemsky.filters

var s:Stream = $(item1, item2);

assertEquals(s.filter(eq(prop(_, "bool"), true)).first, item2);
assertEquals(s.filter(eq(prop(_, "bool"), false)).first, item1);
assertEquals(s.filter(eq(prop("bool"), true)).first, item2);
assertEquals(s.filter(eq(prop("bool"), false)).first, item1);
}

[Test]
Expand Down Expand Up @@ -155,7 +156,7 @@ package com.kemsky.filters

var s:Stream = $(item1, item2);

var result:Stream = s.filter(gt(prop(_, "price"), 1));
var result:Stream = s.filter(gt(prop("price"), 1));
assertEquals(result.length, 1);
assertEquals(result.first, item2);

Expand All @@ -167,27 +168,73 @@ package com.kemsky.filters
assertEquals(result.length, 1);
assertEquals(result.first, item2.price);

result = s.filter(ge(prop(_, "price"), 2));
result = s.filter(ge(prop("price"), 2));
assertEquals(result.length, 1);
assertEquals(result.first, item2);

result = s.filter(gt(add(prop(_, "price"), prop(_, "vat"), 0), 2));
result = s.filter(gt(add(prop("price"), prop("vat"), 0), 2));
assertEquals(result.length, 1);
assertEquals(result.first, item1);

result = s.filter(gt(subtract(prop(_, "price"), prop(_, "vat")), 0));
result = s.filter(gt(subtract(prop("price"), prop("vat")), 0));
assertEquals(result.length, 1);
assertEquals(result.first, item2);

result = s.filter(gt(subtract(prop(_, "price"), 1), 0));
result = s.filter(gt(subtract(prop("price"), 1), 0));
assertEquals(result.length, 1);
assertEquals(result.first, item2);

result = s.filter(gt(0, 1));
assertEquals(result.length, 0);

result = s.filter(ge(prop(prop(_, "name"), "length"), 1));
assertEquals(result.length, 2);
var obj:Item = new Item("p0");
obj.item = new Item("p1");
obj.item.item = new Item("p2");
obj.item.item.item = new Item("p3");
obj.item.item.item.item = new Item("p4");

var nested:Stream = $(obj);

result = nested.filter(eq(prop("name"), "p0"));
assertEquals(result.length, 1);

result = nested.filter(eq(prop("name1"), undefined));
assertEquals(result.length, 1);


result = nested.filter(eq(prop("item.name"), "p1"));
assertEquals(result.length, 1);

result = nested.filter(eq(prop("item.name1"), undefined));
assertEquals(result.length, 1);


result = nested.filter(eq(prop("item.item.name"), "p2"));
assertEquals(result.length, 1);

result = nested.filter(eq(prop("item.item.name1"), undefined));
assertEquals(result.length, 1);


result = nested.filter(eq(prop("item.item.item.name"), "p3"));
assertEquals(result.length, 1);

result = nested.filter(eq(prop("item.item.item.name1"), undefined));
assertEquals(result.length, 1);


result = nested.filter(eq(prop("item.item.item.item.name"), "p4"));
assertEquals(result.length, 1);

result = nested.filter(eq(prop("item.item.item.item.name1"), undefined));
assertEquals(result.length, 1);

try
{
nested.filter(eq(prop("item.item.item.item.item.name"), "p5"));
assertTrue(false);
}
catch(e:Error){}

//some fun
result = s.filter(ge(function (item:Item):Number
Expand Down Expand Up @@ -221,8 +268,8 @@ package com.kemsky.filters

var s:Stream = $(item);

assertEquals(s.filter(mapped(prop(_, "name"), d)).length, 1);
assertEquals(s.filter(mapped(prop(_, "name"), o)).length, 1);
assertEquals(s.filter(mapped(prop("name"), d)).length, 1);
assertEquals(s.filter(mapped(prop("name"), o)).length, 1);


var p:Stream = $("name", "price", "vat");
Expand Down
8 changes: 4 additions & 4 deletions testSrc/com/kemsky/support/TestSupport.as
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ package com.kemsky.support
assertTrue(toValue(undefined, undefined) === undefined);


assertEquals(toValue(1, undefined), 1);
assertEquals(toValue("test", undefined), "test");
assertEquals(toValue(date, undefined), date);
assertEquals(toValue(null, undefined), null);
assertTrue(toValue(1, undefined) === undefined);
assertTrue(toValue("test", undefined) === undefined);
assertTrue(toValue(date, undefined) === undefined);
assertTrue(toValue(null, undefined) === undefined);

var f:Function = function(value:*):*
{
Expand Down

0 comments on commit 89f25aa

Please sign in to comment.