123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- //
- // RACEvent.m
- // ReactiveObjC
- //
- // Created by Justin Spahr-Summers on 2013-01-07.
- // Copyright (c) 2013 GitHub, Inc. All rights reserved.
- //
- #import "RACEvent.h"
- @interface RACEvent ()
- // An object associated with this event. This will be used for the error and
- // value properties.
- @property (nonatomic, strong, readonly) id object;
- // Initializes the receiver with the given type and object.
- - (instancetype)initWithEventType:(RACEventType)type object:(id)object;
- @end
- @implementation RACEvent
- #pragma mark Properties
- - (BOOL)isFinished {
- return self.eventType == RACEventTypeCompleted || self.eventType == RACEventTypeError;
- }
- - (NSError *)error {
- return (self.eventType == RACEventTypeError ? self.object : nil);
- }
- - (id)value {
- return (self.eventType == RACEventTypeNext ? self.object : nil);
- }
- #pragma mark Lifecycle
- + (instancetype)completedEvent {
- static dispatch_once_t pred;
- static id singleton;
- dispatch_once(&pred, ^{
- singleton = [[self alloc] initWithEventType:RACEventTypeCompleted object:nil];
- });
- return singleton;
- }
- + (instancetype)eventWithError:(NSError *)error {
- return [[self alloc] initWithEventType:RACEventTypeError object:error];
- }
- + (instancetype)eventWithValue:(id)value {
- return [[self alloc] initWithEventType:RACEventTypeNext object:value];
- }
- - (instancetype)initWithEventType:(RACEventType)type object:(id)object {
- self = [super init];
- _eventType = type;
- _object = object;
- return self;
- }
- #pragma mark NSCopying
- - (id)copyWithZone:(NSZone *)zone {
- return self;
- }
- #pragma mark NSObject
- - (NSString *)description {
- NSString *eventDescription = nil;
- switch (self.eventType) {
- case RACEventTypeCompleted:
- eventDescription = @"completed";
- break;
- case RACEventTypeError:
- eventDescription = [NSString stringWithFormat:@"error = %@", self.object];
- break;
- case RACEventTypeNext:
- eventDescription = [NSString stringWithFormat:@"next = %@", self.object];
- break;
- default:
- NSCAssert(NO, @"Unrecognized event type: %i", (int)self.eventType);
- }
- return [NSString stringWithFormat:@"<%@: %p>{ %@ }", self.class, self, eventDescription];
- }
- - (NSUInteger)hash {
- return self.eventType ^ [self.object hash];
- }
- - (BOOL)isEqual:(id)event {
- if (event == self) return YES;
- if (![event isKindOfClass:RACEvent.class]) return NO;
- if (self.eventType != [event eventType]) return NO;
- // Catches the nil case too.
- return self.object == [event object] || [self.object isEqual:[event object]];
- }
- @end
|