Objective-C bounded worker pool with ordered results
Objective-C
#import <Foundation/Foundation.h>
static NSArray *RunPool(NSArray *inputs, NSUInteger workers, id (^work)(id input, NSError **error)) {
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationCount = (NSInteger)workers;
NSMutableArray *results = [NSMutableArray arrayWithArray:inputs];
NSMutableArray *errors = [NSMutableArray arrayWithArray:inputs];
NSLock *lock = [NSLock new];
[inputs enumerateObjectsUsingBlock:^(id input, NSUInteger idx, BOOL *stop) {
[queue addOperationWithBlock:^{
NSError *error = nil;
id value = work(input, &error);
[lock lock];
results[idx] = value ?: [NSNull null];
errors[idx] = error ?: [NSNull null];
[lock unlock];
}];
}];
[queue waitUntilAllOperationsAreFinished];
return @[results, errors];
}