ably-cocoa/Source/ARTEventEmitter.h

92 lines
2.8 KiB
Objective-C

#import <Foundation/Foundation.h>
@class ARTRealtime;
@class ARTEventEmitter;
NS_ASSUME_NONNULL_BEGIN
@protocol ARTEventIdentification
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
- (NSString *)identification;
@end
@interface ARTEvent : NSObject<ARTEventIdentification>
- (instancetype)initWithString:(NSString *)value;
+ (instancetype)newWithString:(NSString *)value;
@end
@interface ARTEventListener : NSObject
@end
#pragma mark - ARTEventEmitter
@interface ARTEventEmitter<EventType:id<ARTEventIdentification>, ItemType> : NSObject
- (instancetype)init UNAVAILABLE_ATTRIBUTE;
- (ARTEventListener *)on:(EventType)event callback:(void (^)(ItemType))cb;
- (ARTEventListener *)on:(void (^)(ItemType))cb;
- (ARTEventListener *)once:(EventType)event callback:(void (^)(ItemType))cb;
- (ARTEventListener *)once:(void (^)(ItemType))cb;
- (void)off:(EventType)event listener:(ARTEventListener *)listener;
- (void)off:(ARTEventListener *)listener;
- (void)off;
@end
// This macro adds methods to a class header file that mimic the API of an event emitter.
// This way you can automatically "implement the EventEmitter pattern" for a class
// as the spec says. It's supposed to be used together with ART_EMBED_IMPLEMENTATION_EVENT_EMITTER
// in the implementation of the class.
#define ART_EMBED_INTERFACE_EVENT_EMITTER(EventType, ItemType) - (ARTEventListener *)on:(EventType)event callback:(void (^)(ItemType))cb;\
- (ARTEventListener *)on:(void (^)(ItemType))cb;\
\
- (ARTEventListener *)once:(EventType)event callback:(void (^)(ItemType))cb;\
- (ARTEventListener *)once:(void (^)(ItemType))cb;\
\
- (void)off:(EventType)event listener:(ARTEventListener *)listener;\
- (void)off:(ARTEventListener *)listener;\
- (void)off;
// This macro adds methods to a class implementation that just bridge calls to an internal
// instance variable, which must be called _eventEmitter, of type ARTEventEmitter *.
// It's supposed to be used together with ART_EMBED_INTERFACE_EVENT_EMITTER in the
// header file of the class.
#define ART_EMBED_IMPLEMENTATION_EVENT_EMITTER(EventType, ItemType) - (ARTEventListener *)on:(EventType)event callback:(void (^)(ItemType))cb {\
return [_eventEmitter on:event callback:cb];\
}\
\
- (ARTEventListener *)on:(void (^)(ItemType))cb {\
return [_eventEmitter on:cb];\
}\
\
- (ARTEventListener *)once:(EventType)event callback:(void (^)(ItemType))cb {\
return [_eventEmitter once:event callback:cb];\
}\
\
- (ARTEventListener *)once:(void (^)(ItemType))cb {\
return [_eventEmitter once:cb];\
}\
\
- (void)off:(EventType)event listener:(ARTEventListener *)listener {\
[_eventEmitter off:event listener:listener];\
}\
\
- (void)off:(ARTEventListener *)listener {\
[_eventEmitter off:listener];\
}\
- (void)off {\
[_eventEmitter off];\
}\
\
- (void)emit:(EventType)event with:(ItemType)data {\
[_eventEmitter emit:event with:data];\
}
NS_ASSUME_NONNULL_END