Signal ing out of callback hell

31
SIGNAL-ING OUT OF CALLBACK HELL whoami / Omer Iqbal @olenhad

Transcript of Signal ing out of callback hell

Page 1: Signal ing out of callback hell

SIGNAL-ING OUT OFCALLBACK HELL

whoami / Omer Iqbal @olenhad

Page 2: Signal ing out of callback hell

Functional Reactive Programming

Compositional Event Systems? ^

Page 3: Signal ing out of callback hell

WHY?The world is asynchronous

Programs need to interact with the world

Page 4: Signal ing out of callback hell

But we have Listeners/Observer/Delegate/CallbackPatterns! Life's good! Go away!

Page 5: Signal ing out of callback hell

// Yeah, the empire still uses Objective C

@protocol DeathStarDelegate {- (void)didBlowUp;}

// In DeathStar@property (nonatomic, weak) id <DeathStarDelegate> delegate

// When Blowing up[self.delegate didBlowUp];

// In DarthVader who implements DeathStarDelegate- (void)didBlowUp { NSLog(@"Need to hire better stormtroopers");}

Page 6: Signal ing out of callback hell

PROBLEMS?Unpredictable OrderMissing EventsCleaning up listenersAccidentalRecursionMESSY STATE EwwMulthreading OMG

Page 7: Signal ing out of callback hell

Chaining dependent operations

Page 8: Signal ing out of callback hell

"our intellectual powers are rather geared to master staticrelations and that our powers to visualize processes

evolving in time are relatively poorly developed"

Dijkstra on GOTO

Page 9: Signal ing out of callback hell

ENTER FRP/COMPOSITIONAL EVENTSYSTEMS

Page 10: Signal ing out of callback hell

Imperative programming describes computations as a seriesof actions modifying program state

var numbers = [1,2,3,4,5];var even = [];

numbers.forEach(function(n) { if (n % 2 == 0) { even.push(n); }});

console.log(even);

Page 11: Signal ing out of callback hell

In functional programming we describe what we want ratherthan how we want it done

var numbers = [1,2,3,4,5];var even = numbers.filter(function(n){ return n % 2 == 0;});

Page 12: Signal ing out of callback hell

In FP we model computations as transformations of values

DeclarativePureThreadsafeComposable

Page 13: Signal ing out of callback hell

FRP extends this principle to asynchronous flows

Page 14: Signal ing out of callback hell

SIGNALSRepresenting a stream of values (over time)

e.g Async operations like API calls/UI Input/Timer RETURNSignals

Sends three kinds of events

NextErrorCompleted

Page 15: Signal ing out of callback hell

Signals can be subscribed to

[lannisterSignal subscribeNext:̂(NSString *name){ NSLog(@"%@ is a true Lannister", name);}];

[lannisterSignal sendNext:@"Cersei"];[lannisterSignal sendNext:@"Jamie"];

[lannisterSignal sendCompleted];

[lannisterSignal sendNext:@"Tyrion"]; // Nothing logged here. Sorry Tyrion

Page 16: Signal ing out of callback hell

Creating Signals

- (RACSignal *)signInSignal{ return [RACSignal createSignal:̂RACDisposable *(id<RACSubscriber> subscriber) {

[self.signInService signInWithUsername:self.txtUsername.text password:self.txtPassword.text complete:̂(BOOL status, NSError *error) { if (error) { [subscriber sendError:error]; } else { [subscriber sendNext:@(status)]; [subscriber sendCompleted]; } }];

return nil;

Page 17: Signal ing out of callback hell

I know what you're thinking

Page 18: Signal ing out of callback hell

COMPOSITION!Signals like values can be transformed via higher order

functions!

Page 19: Signal ing out of callback hell

Signal A -> Signal B

map

[lannisterSignal map:̂NSNumber *(NSString *name){ return @(name.length);}];

Page 20: Signal ing out of callback hell

Signal A -> predicate? -> Signal A

filter

[lannisterSignal filter:̂BOOL (NSString *name){ return ![name isEqualToString:@"Tyrion"];}];

Page 21: Signal ing out of callback hell

Merge

RACSignal *contenders =[RACSignal merge:@[lannisters, baratheons, starks, tyrells]];

Page 22: Signal ing out of callback hell

Signal of Signals

[khaleesiSignal map:̂RACSignal *(NSString *name){ return [[Khaleesi sharedInstance] fetchDragons];}];

Page 23: Signal ing out of callback hell

flatMap!

flatten: Signal (Signal A) -> Signal A

map: Signal A -> Signal B

psst... Also called bind. Shoutout to all the Haskell folks

Page 24: Signal ing out of callback hell

Chaining dependent async operations

[[[[client logIn]then:̂{ return [client loadCachedMessages];}]flattenMap:̂(NSArray *messages) { return [client fetchMessagesAfterMessage:messages.lastObject];}]subscribeError:̂(NSError *error) { [self presentError:error];} completed:̂{ NSLog(@"Fetched all messages.");}];

Page 25: Signal ing out of callback hell

PIPELINES!

Page 26: Signal ing out of callback hell

Declarative! => Clear Ordering

Composable!

No explicit state machine to manage!

Unified interface for Async events

Page 27: Signal ing out of callback hell
Page 28: Signal ing out of callback hell

BUT!

Not a silver bullet

Hot Signals vs Cold Signals

Page 29: Signal ing out of callback hell

GOOD NEWS!

RAC3 uses Signal and SignalProducer types to distinguish

Page 30: Signal ing out of callback hell

SIMPLE, NOT EASY THANKS RICH HICKEY!

Simple vs Complex

Easy vs Hard

Page 31: Signal ing out of callback hell

questions? answers : end;