This pod is used by
SHFoundationAdditions
as part of several components improving Foundation, UIKit, CoreLocation, GameKit, MapKit and other aspects of an iOS application's architecture.
NSFastEnumeration helpers and enumeration blocks through a protocol on foundation collection classes. Helpers for both keyed, index and unordered collection objects. Converting to other collection classes through dot notation. Block based callers for enumeration. Tested and ready.
- NSArray and NSMutableArray
- NSOrderedSet and NSMutableOrderedSet
- NSSet, NSMutableSet and NSCountedset
- NSHashTable
- NSDictionary and NSMutableDictionary
- NSMapTable
TODO: NSIndexSet, NSMutableIndexSet and NSEnumerator.
TODO: Keyed protocols
pod 'SHFastEnumerationProtocols'
Put this either in specific files or your project prefix file
#import "<CollectionClass>+SHFastEnumerationProtocols.h"
or for all classes
#import "SHFastEnumerationProtocols.h"
#pragma mark - Block Definitions
//obj is the key for keyed indexed classes (NSDictionary, NSMapTable)
typedef void (^SHIteratorBlock)(id obj);
typedef void (^SHIteratorWithIndexBlock)(id obj, NSInteger index) ;
typedef id (^SHIteratorReturnIdBlock)(id obj);
typedef id (^SHIteratorReduceBlock)(id memo, id obj);
typedef BOOL (^SHIteratorPredicateBlock)(id obj);
#pragma mark - <SHFastEnumerationBlocks>
@protocol SHFastEnumerationBlocks <NSObject>
@required
//obj is the key for keyed indexed classes (NSDictionary, NSMapTable)
-(void)SH_each:(SHIteratorBlock)theBlock;
//the loop is on HIGH queue, each iteration on BACKGROUND, completion callback is on main
-(void)SH_concurrentEach:(SHIteratorBlock)theBlock onComplete:(SHIteratorBlock)theCompleteBlock;
//Collect
-(instancetype)SH_map:(SHIteratorReturnIdBlock)theBlock;
//Inject/FoldLeft
-(id)SH_reduceValue:(id)theValue withBlock:(SHIteratorReduceBlock)theBlock;
//Match
-(id)SH_find:(SHIteratorPredicateBlock)theBlock;
//Select/Filter
-(instancetype)SH_findAll:(SHIteratorPredicateBlock)theBlock;
//!Select/Filter
-(instancetype)SH_reject:(SHIteratorPredicateBlock)theBlock;
//Every
-(BOOL)SH_all:(SHIteratorPredicateBlock)theBlock;
//Some
-(BOOL)SH_any:(SHIteratorPredicateBlock)theBlock;
// !Every
-(BOOL)SH_none:(SHIteratorPredicateBlock)theBlock;
@end
#pragma mark - <SHFastEnumerationProperties>
@protocol SHFastEnumerationProperties <NSObject>
@required
@property(nonatomic,readonly) BOOL SH_hasObjects;
@property(nonatomic,readonly) NSArray * SH_toArray;
@property(nonatomic,readonly) NSSet * SH_toSet;
@property(nonatomic,readonly) NSOrderedSet * SH_toOrderedSet;
//The objects are the values while the key will either be an NSNumber index (from ordered)
//or a counted key (unordereD)
@property(nonatomic,readonly) NSDictionary * SH_toDictionary;
@property(nonatomic,readonly) NSMapTable * SH_toMapTableWeakToWeak;
@property(nonatomic,readonly) NSMapTable * SH_toMapTableWeakToStrong;
@property(nonatomic,readonly) NSMapTable * SH_toMapTableStrongToStrong;
@property(nonatomic,readonly) NSMapTable * SH_toMapTableStrongToWeak;
@property(nonatomic,readonly) NSHashTable * SH_toHashTableWeak;
@property(nonatomic,readonly) NSHashTable * SH_toHashTableStrong;
//https://gist.github.com/seivan/6086183
@property(nonatomic,readonly) NSDecimalNumber * SH_collectionAvg;
@property(nonatomic,readonly) NSDecimalNumber * SH_collectionSum;
@property(nonatomic,readonly) id SH_collectionMax;
@property(nonatomic,readonly) id SH_collectionMin;
@end
#pragma mark - <SHFastEnumerationOrderedBlocks>
@protocol SHFastEnumerationOrderedBlocks <NSObject>
@required
-(void)SH_eachWithIndex:(SHIteratorWithIndexBlock)theBlock;
@end
#pragma mark - <SHFastEnumerationOrderedProperties>
@protocol SHFastEnumerationOrderedProperties <NSObject>
@required
@property(nonatomic,readonly) id SH_firstObject;
@property(nonatomic,readonly) id SH_lastObject;
@end
#pragma mark - <SHFastEnumerationOrdered>
@protocol SHFastEnumerationOrdered <NSObject>
@required
-(instancetype)SH_reverse;
-(id)SH_objectBeforeObject:(id)theObject;
-(id)SH_objectAfterObject:(id)theObject;
@end
#pragma mark - <SHMutableFastEnumerationBlocks>
@protocol SHMutableFastEnumerationBlocks <NSObject>
@required
-(void)SH_modifyMap:(SHIteratorReturnIdBlock)theBlock;
-(void)SH_modifyFindAll:(SHIteratorPredicateBlock)theBlock;
-(void)SH_modifyReject:(SHIteratorPredicateBlock)theBlock;
@end
#pragma mark - <SHMutableFastEnumerationOrdered>
@protocol SHMutableFastEnumerationOrdered <NSObject>
@required
-(void)SH_modifyReverse;
-(id)SH_popObjectAtIndex:(NSInteger)theIndex;
-(id)SH_popFirstObject;
-(id)SH_popLastObject;
@end
If you end up using SHFastEnumerationProtocols in a project, I'd love to hear about it.
email: seivan.heidari@icloud.com
twitter: @seivanheidari
SHFastEnumerationProtocols is © 2013 Seivan and may be freely
distributed under the MIT license.
See the LICENSE.md
file.