Multicast and side effects additions

This commit is contained in:
Peter 2015-05-06 21:44:17 +03:00
parent 14382c3244
commit 016f6e39e0
4 changed files with 63 additions and 0 deletions

View File

@ -5,4 +5,7 @@
- (SSignal *)multicastedSignalForKey:(NSString *)key producer:(SSignal *(^)())producer;
- (void)startStandaloneSignalIfNotRunningForKey:(NSString *)key producer:(SSignal *(^)())producer;
- (SSignal *)multicastedPipeForKey:(NSString *)key;
- (void)putNext:(id)next toMulticastedPipeForKey:(NSString *)key;
@end

View File

@ -4,6 +4,7 @@
#import "SSignal+SideEffects.h"
#import "SBag.h"
#import "SMetaDisposable.h"
#import "SBlockDisposable.h"
#import <libkern/OSAtomic.h>
@ -12,6 +13,7 @@
OSSpinLock _lock;
NSMutableDictionary *_multicastSignals;
NSMutableDictionary *_standaloneSignalDisposables;
NSMutableDictionary *_pipeListeners;
}
@end
@ -25,6 +27,7 @@
{
_multicastSignals = [[NSMutableDictionary alloc] init];
_standaloneSignalDisposables = [[NSMutableDictionary alloc] init];
_pipeListeners = [[NSMutableDictionary alloc] init];
}
return self;
}
@ -123,4 +126,42 @@
}
}
- (SSignal *)multicastedPipeForKey:(NSString *)key
{
return [[SSignal alloc] initWithGenerator:^id<SDisposable>(SSubscriber *subscriber)
{
OSSpinLockLock(&_lock);
SBag *bag = _pipeListeners[key];
if (bag == nil)
{
bag = [[SBag alloc] init];
_pipeListeners[key] = bag;
}
NSInteger index = [bag addItem:[^(id next)
{
[subscriber putNext:next];
} copy]];
OSSpinLockUnlock(&_lock);
return [[SBlockDisposable alloc] initWithBlock:^
{
OSSpinLockLock(&_lock);
[(SBag *)_pipeListeners[key] removeItem:index];
OSSpinLockUnlock(&_lock);
}];
}];
}
- (void)putNext:(id)next toMulticastedPipeForKey:(NSString *)key
{
OSSpinLockLock(&_lock);
NSArray *pipeListeners = [(SBag *)_pipeListeners[key] copyItems];
OSSpinLockUnlock(&_lock);
for (void (^listener)(id) in pipeListeners)
{
listener(next);
}
}
@end

View File

@ -3,6 +3,7 @@
@interface SSignal (SideEffects)
- (SSignal *)onNext:(void (^)(id next))f;
- (SSignal *)afterNext:(void (^)(id next))f;
- (SSignal *)onError:(void (^)(id error))f;
- (SSignal *)onCompletion:(void (^)())f;
- (SSignal *)onDispose:(void (^)())f;

View File

@ -23,6 +23,24 @@
}];
}
- (SSignal *)afterNext:(void (^)(id next))f
{
return [[SSignal alloc] initWithGenerator:^id<SDisposable> (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<SDisposable> (SSubscriber *subscriber)