session-ios/Signal/src/util/FunctionalUtil.m

107 lines
2.3 KiB
Mathematica
Raw Normal View History

2017-02-13 17:40:30 +01:00
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import "FunctionalUtil.h"
2014-05-06 19:41:08 +02:00
@implementation NSArray (FunctionalUtil)
- (bool)any:(int (^)(id item))predicate {
ows_require(predicate != nil);
2014-05-06 19:41:08 +02:00
for (id e in self) {
if (predicate(e)) {
return true;
}
}
return false;
}
- (bool)all:(int (^)(id item))predicate {
ows_require(predicate != nil);
2014-05-06 19:41:08 +02:00
for (id e in self) {
if (!predicate(e)) {
return false;
}
}
return true;
}
- (id)firstMatchingElseNil:(int (^)(id item))predicate {
ows_require(predicate != nil);
2014-05-06 19:41:08 +02:00
for (id e in self) {
if (predicate(e)) {
return e;
}
}
return nil;
}
- (NSArray *)map:(id (^)(id item))projection {
ows_require(projection != nil);
NSMutableArray *r = [NSMutableArray arrayWithCapacity:self.count];
2014-05-06 19:41:08 +02:00
for (id e in self) {
[r addObject:projection(e)];
}
return r;
}
- (NSArray *)filter:(int (^)(id item))predicate {
ows_require(predicate != nil);
NSMutableArray *r = [NSMutableArray array];
2014-05-06 19:41:08 +02:00
for (id e in self) {
if (predicate(e)) {
[r addObject:e];
}
}
return r;
}
- (double)sumDouble {
2014-05-06 19:41:08 +02:00
double s = 0.0;
for (NSNumber *e in self) {
2014-05-06 19:41:08 +02:00
s += [e doubleValue];
}
return s;
}
- (NSUInteger)sumNSUInteger {
2014-05-06 19:41:08 +02:00
NSUInteger s = 0;
for (NSNumber *e in self) {
2014-05-06 19:41:08 +02:00
s += [e unsignedIntegerValue];
}
return s;
}
- (NSInteger)sumNSInteger {
2014-05-06 19:41:08 +02:00
NSInteger s = 0;
for (NSNumber *e in self) {
2014-05-06 19:41:08 +02:00
s += [e integerValue];
}
return s;
}
- (NSDictionary *)keyedBy:(id (^)(id value))keySelector {
ows_require(keySelector != nil);
2014-05-06 19:41:08 +02:00
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (id value in self) {
result[keySelector(value)] = value;
}
ows_require(result.count == self.count);
2014-05-06 19:41:08 +02:00
return result;
}
- (NSDictionary *)groupBy:(id (^)(id value))keySelector {
ows_require(keySelector != nil);
2014-05-06 19:41:08 +02:00
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (id item in self) {
id key = keySelector(item);
NSMutableArray *group = result[key];
2014-05-06 19:41:08 +02:00
if (group == nil) {
group = [NSMutableArray array];
2014-05-06 19:41:08 +02:00
result[key] = group;
}
[group addObject:item];
}
return result;
}
@end