return {
	execute: execute,
	tryEach: tryEach,
	map: map
}

function tryEach(strategies) {
	return function() {
		for(var i = 0; i < strategies.length; i++) {
			var result = strategies[i]();
			if(result != undefined) {
				return result;
			}
		}
	};
}

function execute(strategy, onSuccess, onError) {
	var result = strategy();
	if(result != undefined) {
		return onSuccess(result);
	} else {
		return onError(result);
	}
}

function map(f, strategy) {
	return function() {
		return execute(strategy, f, function() {return;});
	};
}