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];
}