diff --git a/NSArray+Underscore.m b/NSArray+Underscore.m index 01ccece..22ef3ac 100644 --- a/NSArray+Underscore.m +++ b/NSArray+Underscore.m @@ -4,6 +4,16 @@ @implementation NSArray (Underscore) +- (NSArray *(^)(id o))partition { + return ^NSArray *(BOOL(^block)(id o)) { + id aa = [NSMutableArray new]; + id bb = [NSMutableArray new]; + for (id o in self) + [block(o) ? aa : bb addObject:o]; + return @[aa, bb]; + }; +} + - (NSArray *(^)(NSString *))pluck { return ^NSArray *(NSString *key) { if (!key.length) diff --git a/README.markdown b/README.markdown index 6d172be..3a9d1aa 100644 --- a/README.markdown +++ b/README.markdown @@ -461,6 +461,17 @@ code. `has` was chosen over `contains` or `includes` because it is short and clear. +###NSArray.partition() +```objc +id rv = @[@"A", @"B", @"AA"].partition(^(NSString *s){ + return [s hasPrefix:@"A"]; +}); +//rv => @[@[@"A", @"AA"], @[@"B"]] +``` + +Partitions an array into two arrays based on the boolean return value of your +block. + ###NSDictionary.map() ```objc id rv = @{@1: @2, @2: @4, @3: @9}.map(^(id key, id obj){ diff --git a/YOLO.h b/YOLO.h index d77d957..2af2ae6 100644 --- a/YOLO.h +++ b/YOLO.h @@ -27,6 +27,7 @@ @end @interface NSArray (Underscore) +- (NSArray *(^)(id blockReturningBool))partition; - (NSArray *(^)(NSString *keypath))pluck; - (NSArray *(^)(id arrayOrSetOrObject))without; @end diff --git a/tests b/tests index 6839e2f..10fd409 100755 --- a/tests +++ b/tests @@ -491,6 +491,20 @@ int main() { STAssertEqualObjects(aa, bb, @""); } +- (void)testPartition { + id aa = @[@1, @2, @3, @4].partition(^(NSNumber *n){ + return n.intValue % 2 == 0; + }); + id bb = @[@[@2, @4], @[@1, @3]]; + STAssertEqualObjects(aa, bb, @""); + + aa = @[@"A", @"B", @"AA"].partition(^(NSString *s){ + return [s hasPrefix:@"A"]; + }); + bb = @[@[@"A", @"AA"], @[@"B"]]; + STAssertEqualObjects(aa, bb, @""); +} + @end