Objective-C implementation of functional stuff.
#import <Foundation/Foundation.h>
typedef id (^MapBlock)(id element);
typedef BOOL (^FilterBlock)(id element);
typedef id (^ReduceBlock)(id a, id b);
NSArray* Map(NSArray* list, MapBlock block) {
NSMutableArray* result = [NSMutableArray array];
for (id item in list) {
[result addObject:block(item)];
}
return [NSArray arrayWithArray:result];
}
NSArray* Filter(NSArray* list, FilterBlock block) {
NSMutableArray* result = [NSMutableArray array];
for (id item in list) {
if (block(item)) {
[result addObject:item];
}
}
return [NSArray arrayWithArray:result];
}
id Reduce(NSArray* list, ReduceBlock block) {
if ([list count] == 0) {
return nil;
}
else if ([list count] == 1) {
return [list firstObject];
}
else {
id result = nil;
for (id item in list) {
if (!result) {
result = item;
}
else {
result = block(result, item);
}
}
return result;
}
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSArray* numbers = @[ @0, @1, @2, @3, @4, @5, @6, @7, @8, @9 ];
NSArray* evens = Filter(numbers, ^BOOL(id element) {
return [element integerValue] % 2 == 0;
});
for (id n in evens) {
NSLog(@"%@", n);
}
NSLog(@"\n");
NSArray* multiples = Map(evens, ^id(id element) {
NSInteger result = [element integerValue] * 10;
return [NSNumber numberWithInteger:result];
});
for (id n in multiples) {
NSLog(@"%@", n);
}
NSLog(@"\n");
id result = Reduce(multiples, ^id(id a, id b) {
NSInteger sum = [a integerValue] + [b integerValue];
return [NSNumber numberWithInteger:sum];
});
NSLog(@"%@", result);
}
}