From 8b58dcf1cef47aa55505c8549a5226db37415632 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 12 Sep 2018 09:07:10 -0400 Subject: [PATCH] fucntional methods for array --- .../Categories/NSArray+MFConvenience.h | 5 ++- .../Categories/NSArray+MFConvenience.m | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/MVMCore/MVMCore/Categories/NSArray+MFConvenience.h b/MVMCore/MVMCore/Categories/NSArray+MFConvenience.h index 73a9c89..9459b1a 100644 --- a/MVMCore/MVMCore/Categories/NSArray+MFConvenience.h +++ b/MVMCore/MVMCore/Categories/NSArray+MFConvenience.h @@ -38,6 +38,9 @@ - (nonnull NSString *)stringAtIndex:(NSUInteger)index; // Maps this array to a new array of T objects given a conversion block. Objective-C implementation of Swift's map. https://developer.apple.com/documentation/swift/array/2908681-map -- (nonnull NSArray *) map:(id _Nullable (^_Nonnull)(id _Nonnull obj))mapBlock; +- (nonnull NSArray *)map:(id _Nullable (^_Nonnull)(id _Nonnull obj))mapBlock; +- (nonnull NSArray *)filter:(BOOL (^_Nullable)(id _Nonnull obj))block; +- (nonnull id)reduce:(nonnull id)initial block:(id (^_Nullable)(id _Nonnull obj1, id obj2))block; +- (NSArray *_Nullable)flatMap:(id (^_Nonnull)(id obj))block; @end diff --git a/MVMCore/MVMCore/Categories/NSArray+MFConvenience.m b/MVMCore/MVMCore/Categories/NSArray+MFConvenience.m index 8810bea..c2c8839 100644 --- a/MVMCore/MVMCore/Categories/NSArray+MFConvenience.m +++ b/MVMCore/MVMCore/Categories/NSArray+MFConvenience.m @@ -96,4 +96,36 @@ return mapped; } +- (NSArray *)filter:(BOOL (^)(id obj))block { + NSMutableArray *mutableArray = [NSMutableArray new]; + [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + if (block(obj) == YES) { + [mutableArray addObject:obj]; + } + }]; + return mutableArray; +} + +- (id)reduce:(id)initial block:(id (^)(id obj1, id obj2))block { + __block id obj = initial; + [self enumerateObjectsUsingBlock:^(id _obj, NSUInteger idx, BOOL *stop) { + obj = block(obj, _obj); + }]; + return obj; +} + +- (NSArray *)flatMap:(id (^)(id obj))block { + NSMutableArray *mutableArray = [NSMutableArray new]; + [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + id _obj = block(obj); + if ([_obj isKindOfClass:[NSArray class]]) { + NSArray *_array = [_obj flatMap:block]; + [mutableArray addObjectsFromArray:_array]; + return; + } + [mutableArray addObject:_obj]; + }]; + return mutableArray; +} + @end