NSIndexSet+BlocksKit.m 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //
  2. // NSIndexSet+BlocksKit.m
  3. // BlocksKit
  4. //
  5. #import "NSIndexSet+BlocksKit.h"
  6. @implementation NSIndexSet (BlocksKit)
  7. - (void)bk_each:(void (^)(NSUInteger index))block {
  8. NSParameterAssert(block != nil);
  9. [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
  10. block(idx);
  11. }];
  12. }
  13. - (void)bk_apply:(void (^)(NSUInteger index))block {
  14. NSParameterAssert(block != nil);
  15. [self enumerateIndexesWithOptions:NSEnumerationConcurrent usingBlock:^(NSUInteger idx, BOOL *stop) {
  16. block(idx);
  17. }];
  18. }
  19. - (NSUInteger)bk_match:(BOOL (^)(NSUInteger index))block {
  20. NSParameterAssert(block != nil);
  21. return [self indexPassingTest:^BOOL(NSUInteger idx, BOOL *stop) {
  22. return block(idx);
  23. }];
  24. }
  25. - (NSIndexSet *)bk_select:(BOOL (^)(NSUInteger index))block {
  26. NSParameterAssert(block != nil);
  27. NSIndexSet *list = [self indexesPassingTest:^BOOL(NSUInteger idx, BOOL *stop) {
  28. return block(idx);
  29. }];
  30. if (!list.count) return nil;
  31. return list;
  32. }
  33. - (NSIndexSet *)bk_reject:(BOOL (^)(NSUInteger index))block {
  34. NSParameterAssert(block != nil);
  35. return [self bk_select:^BOOL(NSUInteger idx) {
  36. return !block(idx);
  37. }];
  38. }
  39. - (NSIndexSet *)bk_map:(NSUInteger (^)(NSUInteger index))block {
  40. NSParameterAssert(block != nil);
  41. NSMutableIndexSet *list = [NSMutableIndexSet indexSet];
  42. [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
  43. [list addIndex:block(idx)];
  44. }];
  45. if (!list.count) return nil;
  46. return list;
  47. }
  48. - (NSArray *)bk_mapIndex:(id (^)(NSUInteger index))block {
  49. NSParameterAssert(block != nil);
  50. NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count];
  51. [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
  52. id value = block(idx) ?: [NSNull null];
  53. [result addObject:value];
  54. }];
  55. return result;
  56. }
  57. - (BOOL)bk_any:(BOOL (^)(NSUInteger index))block {
  58. return [self bk_match:block] != NSNotFound;
  59. }
  60. - (BOOL)bk_none:(BOOL (^)(NSUInteger index))block {
  61. return [self bk_match:block] == NSNotFound;
  62. }
  63. - (BOOL)bk_all:(BOOL (^)(NSUInteger index))block {
  64. NSParameterAssert(block != nil);
  65. __block BOOL result = YES;
  66. [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
  67. if (!block(idx)) {
  68. result = NO;
  69. *stop = YES;
  70. }
  71. }];
  72. return result;
  73. }
  74. @end