mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.6 KiB
Matlab
98 lines
2.6 KiB
Matlab
5 years ago
|
//
|
||
|
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "FunctionalUtil.h"
|
||
|
|
||
|
NS_ASSUME_NONNULL_BEGIN
|
||
|
|
||
|
@interface FUBadArgument : NSException
|
||
|
|
||
|
+ (FUBadArgument *) new:(NSString *)reason;
|
||
|
+ (void)raise:(NSString *)message;
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation FUBadArgument
|
||
|
|
||
|
+ (FUBadArgument *) new:(NSString *)reason {
|
||
|
return [[FUBadArgument alloc] initWithName:@"Invalid Argument" reason:reason userInfo:nil];
|
||
|
}
|
||
|
+ (void)raise:(NSString *)message {
|
||
|
[FUBadArgument raise:@"Invalid Argument" format:@"%@", message];
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
#define tskit_require(expr) \
|
||
|
if (!(expr)) { \
|
||
|
NSString *reason = \
|
||
|
[NSString stringWithFormat:@"require %@ (in %s at line %d)", (@ #expr), __FILE__, __LINE__]; \
|
||
|
OWSLogError(@"%@", reason); \
|
||
|
[FUBadArgument raise:reason]; \
|
||
|
};
|
||
|
|
||
|
|
||
|
@implementation NSArray (FunctionalUtil)
|
||
|
- (bool)any:(int (^)(id item))predicate {
|
||
|
tskit_require(predicate != nil);
|
||
|
for (id e in self) {
|
||
|
if (predicate(e)) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
- (bool)all:(int (^)(id item))predicate {
|
||
|
tskit_require(predicate != nil);
|
||
|
for (id e in self) {
|
||
|
if (!predicate(e)) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
- (NSArray *)map:(id (^)(id item))projection {
|
||
|
tskit_require(projection != nil);
|
||
|
|
||
|
NSMutableArray *r = [NSMutableArray arrayWithCapacity:self.count];
|
||
|
for (id e in self) {
|
||
|
[r addObject:projection(e)];
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
- (NSArray *)filter:(int (^)(id item))predicate {
|
||
|
tskit_require(predicate != nil);
|
||
|
|
||
|
NSMutableArray *r = [NSMutableArray array];
|
||
|
for (id e in self) {
|
||
|
if (predicate(e)) {
|
||
|
[r addObject:e];
|
||
|
}
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
- (NSDictionary *)groupBy:(id (^)(id value))keySelector {
|
||
|
tskit_require(keySelector != nil);
|
||
|
|
||
|
NSMutableDictionary *result = [NSMutableDictionary dictionary];
|
||
|
|
||
|
for (id item in self) {
|
||
|
id key = keySelector(item);
|
||
|
|
||
|
NSMutableArray *group = result[key];
|
||
|
if (group == nil) {
|
||
|
group = [NSMutableArray array];
|
||
|
result[key] = group;
|
||
|
}
|
||
|
[group addObject:item];
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
NS_ASSUME_NONNULL_END
|