software-mariodiana
2/27/2018 - 1:52 AM

Map, Filter, Reduce

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