You could map to blocks instead of values,
NSNumber * (^nextTrack)(NSNumber *) = ^(NSNumber *currentTrack) {
return @(currentTrack.integerValue + 1);
};
NSNumber * (^previousTrack)(NSNumber *) = ^(NSNumber *currentTrack) {
return @(currentTrack.integerValue - 1);
};
Now -mapReplace:
to those instead of @1
/@-1
.
For track selection, -map:
(or here -reduceEach:
) the signal to a block that ignores the track argument and returns the captured track:
reduceEach:^(id tableView, NSIndexPath *indexPath) {
NSInteger newTrack = indexPath.row;
return ^(NSNumber *currentTrack) {
return @(newTrack);
};
}
Now, these can be merged and scanned:
RACSignal *currentIndexSignal = [[RACSignal
merge:@[didSelectS, prevS, nextS]]
scanWithStart:@0 reduce:^(NSNumber *running, NSNumber * (^trackChanger)(NSNumber *)) {
return trackChanger(running);
}];