RACSignalSequence.m 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // RACSignalSequence.m
  3. // ReactiveObjC
  4. //
  5. // Created by Justin Spahr-Summers on 2012-11-09.
  6. // Copyright (c) 2012 GitHub, Inc. All rights reserved.
  7. //
  8. #import "RACSignalSequence.h"
  9. #import "RACDisposable.h"
  10. #import "RACReplaySubject.h"
  11. #import "RACSignal+Operations.h"
  12. @interface RACSignalSequence ()
  13. // Replays the signal given on initialization.
  14. @property (nonatomic, strong, readonly) RACReplaySubject *subject;
  15. @end
  16. @implementation RACSignalSequence
  17. #pragma mark Lifecycle
  18. + (RACSequence *)sequenceWithSignal:(RACSignal *)signal {
  19. RACSignalSequence *seq = [[self alloc] init];
  20. RACReplaySubject *subject = [RACReplaySubject subject];
  21. [signal subscribeNext:^(id value) {
  22. [subject sendNext:value];
  23. } error:^(NSError *error) {
  24. [subject sendError:error];
  25. } completed:^{
  26. [subject sendCompleted];
  27. }];
  28. seq->_subject = subject;
  29. return seq;
  30. }
  31. #pragma mark RACSequence
  32. - (id)head {
  33. id value = [self.subject firstOrDefault:self];
  34. if (value == self) {
  35. return nil;
  36. } else {
  37. return value ?: NSNull.null;
  38. }
  39. }
  40. - (RACSequence *)tail {
  41. RACSequence *sequence = [self.class sequenceWithSignal:[self.subject skip:1]];
  42. sequence.name = self.name;
  43. return sequence;
  44. }
  45. - (NSArray *)array {
  46. return self.subject.toArray;
  47. }
  48. #pragma mark NSObject
  49. - (NSString *)description {
  50. // Synchronously accumulate the values that have been sent so far.
  51. NSMutableArray *values = [NSMutableArray array];
  52. RACDisposable *disposable = [self.subject subscribeNext:^(id value) {
  53. @synchronized (values) {
  54. [values addObject:value ?: NSNull.null];
  55. }
  56. }];
  57. [disposable dispose];
  58. return [NSString stringWithFormat:@"<%@: %p>{ name = %@, values = %@ … }", self.class, self, self.name, values];
  59. }
  60. @end