Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

継続モナドその2

APIをFutureで返す。bindはとりあえず省略。

@interface Future<V> : NSObject
- (void)get:(void(^)(V))cb;
@end


@interface API<I,O> : NSObject
- (Future<O> *)getAPI:(I)input;
@end

typedef void(^CallBack)(id);
typedef void(^CPS)(CallBack);

@interface Future()
@property (nonatomic) CPS cps;
@end

@implementation Future

- (instancetype)init:(CPS)cps {
    self = [super init];
    if (self) {
        self.cps = cps;
    }
    return self;
}

- (void)get:(void (^)(id))cb {
    self.cps(cb);
    self.cps = nil;
}

@end

@implementation API
- (Future *)getAPI:(id)input {
    CPS cps = ^(CallBack cb) {
        return cb(input);
    };
    Future *future = [[Future alloc] init:cps];
    return future;
}
@end