RACEvent.m 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // RACEvent.m
  3. // ReactiveObjC
  4. //
  5. // Created by Justin Spahr-Summers on 2013-01-07.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import "RACEvent.h"
  9. @interface RACEvent ()
  10. // An object associated with this event. This will be used for the error and
  11. // value properties.
  12. @property (nonatomic, strong, readonly) id object;
  13. // Initializes the receiver with the given type and object.
  14. - (instancetype)initWithEventType:(RACEventType)type object:(id)object;
  15. @end
  16. @implementation RACEvent
  17. #pragma mark Properties
  18. - (BOOL)isFinished {
  19. return self.eventType == RACEventTypeCompleted || self.eventType == RACEventTypeError;
  20. }
  21. - (NSError *)error {
  22. return (self.eventType == RACEventTypeError ? self.object : nil);
  23. }
  24. - (id)value {
  25. return (self.eventType == RACEventTypeNext ? self.object : nil);
  26. }
  27. #pragma mark Lifecycle
  28. + (instancetype)completedEvent {
  29. static dispatch_once_t pred;
  30. static id singleton;
  31. dispatch_once(&pred, ^{
  32. singleton = [[self alloc] initWithEventType:RACEventTypeCompleted object:nil];
  33. });
  34. return singleton;
  35. }
  36. + (instancetype)eventWithError:(NSError *)error {
  37. return [[self alloc] initWithEventType:RACEventTypeError object:error];
  38. }
  39. + (instancetype)eventWithValue:(id)value {
  40. return [[self alloc] initWithEventType:RACEventTypeNext object:value];
  41. }
  42. - (instancetype)initWithEventType:(RACEventType)type object:(id)object {
  43. self = [super init];
  44. _eventType = type;
  45. _object = object;
  46. return self;
  47. }
  48. #pragma mark NSCopying
  49. - (id)copyWithZone:(NSZone *)zone {
  50. return self;
  51. }
  52. #pragma mark NSObject
  53. - (NSString *)description {
  54. NSString *eventDescription = nil;
  55. switch (self.eventType) {
  56. case RACEventTypeCompleted:
  57. eventDescription = @"completed";
  58. break;
  59. case RACEventTypeError:
  60. eventDescription = [NSString stringWithFormat:@"error = %@", self.object];
  61. break;
  62. case RACEventTypeNext:
  63. eventDescription = [NSString stringWithFormat:@"next = %@", self.object];
  64. break;
  65. default:
  66. NSCAssert(NO, @"Unrecognized event type: %i", (int)self.eventType);
  67. }
  68. return [NSString stringWithFormat:@"<%@: %p>{ %@ }", self.class, self, eventDescription];
  69. }
  70. - (NSUInteger)hash {
  71. return self.eventType ^ [self.object hash];
  72. }
  73. - (BOOL)isEqual:(id)event {
  74. if (event == self) return YES;
  75. if (![event isKindOfClass:RACEvent.class]) return NO;
  76. if (self.eventType != [event eventType]) return NO;
  77. // Catches the nil case too.
  78. return self.object == [event object] || [self.object isEqual:[event object]];
  79. }
  80. @end