#import "SSignal+SideEffects.h" #import "SBlockDisposable.h" #import "SDisposableSet.h" @implementation SSignal (SideEffects) - (SSignal *)onStart:(void (^)())f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) { f(); return [self startWithNext:^(id next) { [subscriber putNext:next]; } error:^(id error) { [subscriber putError:error]; } completed:^ { [subscriber putCompletion]; }]; }]; } - (SSignal *)onNext:(void (^)(id next))f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) { return [self startWithNext:^(id next) { f(next); [subscriber putNext:next]; } error:^(id error) { [subscriber putError:error]; } completed:^ { [subscriber putCompletion]; }]; }]; } - (SSignal *)afterNext:(void (^)(id next))f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) { return [self startWithNext:^(id next) { [subscriber putNext:next]; f(next); } error:^(id error) { [subscriber putError:error]; } completed:^ { [subscriber putCompletion]; }]; }]; } - (SSignal *)onError:(void (^)(id error))f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) { return [self startWithNext:^(id next) { [subscriber putNext:next]; } error:^(id error) { f(error); [subscriber putError:error]; } completed:^ { [subscriber putCompletion]; }]; }]; } - (SSignal *)onCompletion:(void (^)())f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) { return [self startWithNext:^(id next) { [subscriber putNext:next]; } error:^(id error) { [subscriber putError:error]; } completed:^ { f(); [subscriber putCompletion]; }]; }]; } - (SSignal *)afterCompletion:(void (^)())f { return [[SSignal alloc] initWithGenerator:^id (SSubscriber *subscriber) { return [self startWithNext:^(id next) { [subscriber putNext:next]; } error:^(id error) { [subscriber putError:error]; } completed:^ { [subscriber putCompletion]; f(); }]; }]; } - (SSignal *)onDispose:(void (^)())f { return [[SSignal alloc] initWithGenerator:^(SSubscriber *subscriber) { SDisposableSet *compositeDisposable = [[SDisposableSet alloc] init]; [compositeDisposable add:[self startWithNext:^(id next) { [subscriber putNext:next]; } error:^(id error) { [subscriber putError:error]; } completed:^ { [subscriber putCompletion]; }]]; [compositeDisposable add:[[SBlockDisposable alloc] initWithBlock:^ { f(); }]]; return compositeDisposable; }]; } @end